2009-11-22 47 views
0

那麼,這是一個小問題。在設計關係數據庫語言變體的最佳實踐

我要設計一個Web應用程序數據庫來使用基本上是一種口語的東西。然而,這種語言有兩個字母(拉丁語&西里爾語)和三個實際只有一些細微差異的口語變體(我認爲有幾百個詞略有不同)。爲了使事情更加困難,數據庫和管理界面將被用於兩個應用程序,其中一個應用程序將使用腳本和兩個口頭變體的所有文章(以及界面),其他將只使用一個(拉丁文)。

我寫了拉丁到西里爾語和背部「翻譯」的算法,應該使輸入更容易用戶,但現在我面臨一些我懷疑的數據庫/應用程序規範化問題。

(1)我可以將其視爲口語問題並相應地創建數據庫。

| 'variant' | [id, name] #language variant 
| 'article' | [id, <all variant non-dependent fields>] # such as image, relations, etc 
| 'article_variant' | [id, fk_language_variant_id, fk_article_id, <all variant dependent fields>] #title, body, etc 
| 'article_has_variants' | [id, fk_article_id, fk_article_variant_id] 

但是由於事實,大多數在「article_variant」數據庫的條目將包含相同的信息,這似乎是多餘的。 (2)我可以使用「文章」表和單詞對與「拉丁到西里爾 - 背靠背」算法做到這一點,以便將其顯示給用戶在應用程序級別解決它。然後,我的數據庫將是這個樣子:

| 'variant' | [id, name] #language variant 
| 'article' | id, <all fields> 
| 'words' | id, word 
| 'word_pairs' | id, fk_word_id, fk_word_id 

該解決方案看起來很完美的我,但我很擔心影響它會對應用程序的性能,因爲事實(一)有走線槽一整篇文章每時間顯示爲與每個單詞對的默認語言不同的語言變體,並且(b)之後它必須將字母表中的每個字母(由於複雜的字母轉換(例如,nj→њ))轉換爲它的對。

有什麼想法?

回答

1

我會使用動態選項與緩存。存放物品的唯​​一的一個變體(一個是最初創建)和動態創建的其他變體,如

article = select from articles 
if article.lang != requested_lang 
    text = select from cache where id=article.id and lang=requested_lang 
    if !text 
      text = convert_language(article.text, requested_lang) 
      insert into cache(article.id, requested_lang, text 
    echo text 
else 
    echo article.text 

(這意味着該語言轉換是完全自動的,我不知道這是否是case)

+0

是的,因爲它本質上是相同的語言(可以表示爲有限數量的字對的變體:istorija = historija/hemija = kemija),語言轉換應該是自動自動的。 感謝您使用緩存擴展選項(2)。這應該處理大部分的性能問題。 – Krule 2009-11-22 20:28:47