不久,我將開始編寫將具有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時間更長,查詢運行速度更慢
很高興聽到有關「什麼是更好的」和「爲什麼」的建議?或者有更好的方法嗎?
在此先感謝...
謝謝回答,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
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
看我(相當短)編輯。 – DrColossos 2010-07-12 13:54:52