2010-07-12 107 views
0

不久,我將開始編寫將具有multilang內容支持的目錄(php + mysql)。現在我正在考慮設計數據庫結構的最佳方法。此刻,我看到multilang處理3種方式:Multilang目錄(帶自定義字段)數據庫結構設計

1)具有爲每種語言的具體數據單獨的表,即schematicly它會是這樣的:

  • 將有一個表Main_Content_Items,存儲無法翻譯的基本數據,如ID,creation_date,點擊,投票等 - 它將只有一個,並將引用所有語言。

而這裏是將被dublicated爲每種語言表:

  • Common_Data_LANG表(例如:common_data_en_us)(存儲可被翻譯,但存在對於共同/「靜態」字段eny目錄項:標題,desc等...)
  • Extra_Fields_Data_LANG表(存儲額外字段可以翻譯的數據,但對於自定義項目組可能不同,即:id | item_id | field_type |值| ...) 然後在項目請求中,我們將根據用戶/默認語言查看錶格,並將 main_content表中的可轉換數據加入。

優點:

  • 我們可以更新「主」數據(即命中,票......)這是最經常更新,只有一個查詢
  • 我們不需要Ødublicate數據如果我們有4種或更多種語言,與只使用一個帶'lang'字段的表格的結構相比,則爲4倍或更多倍。因此MySQL查詢將花費更少的時間去通過100000(例如)記錄目錄,而不是40萬個或更多

缺點:

  • +2表爲每種語言

2)在內容表中使用'lang'字段:

  • Main_Content_Items表(存儲無法翻譯的基本數據,如ID,creation_date,點擊率,投票等...)
  • Common_Data表(存儲可翻譯的常見/「靜態」字段,但存在eny目錄項目:| id | item_id | lang |標題| desc |等等......)
  • Extra_Fields_Data表(存儲額外字段的數據可以被翻譯,但對於自定義項目組可能不同,例如:| id | item_id | lang | field_type | value | ... ) 因此,我們將根據'lang'字段將common_data和extra_fields加入到main_content_items中。

優點:

  • 我們可以更新「主」數據(即命中,票......)這是最經常更新,只有一個查詢
  • 我們只有3個表內容數據

缺點:

  • 我們custom_data和extra_fields桌上擺滿機智所有語言H數據,所以它的X時間做大查詢運行速度較慢

3)同爲第2方式,但Main_Content_Items表合併Common_Data,有「郎」字段:

優點:

  • ...?

缺點:

  • 我們需要更新升級的「主」數據(即命中,票......)這是最經常更新,每種語言
  • 我們custom_data和extra_fields表充滿了所有語言的數據,所以它的X時間更長,查詢運行速度更慢

很高興聽到有關「什麼是更好的」和「爲什麼」的建議?或者有更好的方法嗎?

在此先感謝...

回答

0

我給了一個類似前面回答的this question,並強調這種技術的優點(這將是,例如,重要的是我讓應用程序決定的語言和僅通過改變lang參數的SQL查詢的WHERE子句中建立相應的查詢。

GET操作的相當接近你的第二個解決方案。我沒有完全得到了「extra_fields」但如果它是有道理的,你可以(!)將它合併到common_data表中。我會建議你反對第一個想法,因爲w生病的桌子太多,而且很容易丟失那裏的物品。

對你的編輯:我仍然認爲第二種方法更好(這是我的optinion,所以它是相對的;))我不是專家優化,但我認爲適當的索引和適當的表結構速度應該不是一個問題。與往常一樣,最好的方式找到最有效的方法是做這兩種方法,看看這是因爲速度最好將數據結構各不相同,....

+0

謝謝回答,DrColossos。 我作出描述1種方法的錯誤,等有看FIXED VARIANT。好了,主要目標(我很喜歡的)關於第一種方法是,我們不要混淆不同語言的數據,尤其是concidering表extra_fields可以擁有多條記錄鏈接到Main_Content_Items表中的項目 - 即在2,3方法如果Main_Content_Items表中有1000個項目和4個langs,則extra_fields將有4 * 1000 * 5(或10個或更多...)個記錄。這就是爲什麼我認爲這種方法比其他兩種方法更好... – Nickolay 2010-07-12 13:29:17

+0

P.S.關於「extra_fields」:它被用作任何額外字段類型(存儲爲| id | item_id | field_type | field_value(簡單文本字段)|)的通用表,因爲有項目組可以具有某些特定字段, t(比如筆記本和相機在商店腳本中的參數)。所以我們只能取消將common_data表中的字段數據移動到extra_fields,但我不想這樣做,因爲在common_data中每個記錄都有多個字段數據,而extra_fields只有每個記錄有一個字段數據(參見結構) ,所以我認爲最好有2個單獨的表格。 – Nickolay 2010-07-12 13:43:50

+0

看我(相當短)編輯。 – DrColossos 2010-07-12 13:54:52