2014-03-12 134 views
0

的(MySQL的),我們正在開發這是應該支持多語言的問題是,當涉及到動態的領域和如何設計數據庫爲他們數據庫設計模式的多語言web應用程序

讓的說,我們的Web應用程序有這些表:

product(id(Primary),name(text),description(text)) 

    Category(id(Primary),name(text),description(text)) 

,當談到在3種不同的語言在插入數據庫中的數據,我們應該有名稱,描述到目前爲止,我決定實施的數據庫如下: 1.創建一個表作爲中間表具有以下結構:

language_itme(id) 

然後創建另一個表語言具有以下狀結構:

language(id(Primary),field_name(text),en(text),fr(text),it(text),language_item_id(INT)) 

ITEM_ID指language_item表 然後添加以下字段表中的產品和類別的標識語言,

product(id(Primary),name(text),description(text),language_item_id(INT)) 

    Category(id(Primary),name(text),description(text),language_item_id(INT)) 

因此,對於插入產品,我們將在數據庫中插入這些行:

Auto_Generated_num -> language_item; 

然後,

(Auto_Generated_num, productName,productDescription, last_id of language_item) 
    -> product 

然後

(Auto_Generated_num, name, productName in English, productName in French, 
    productName in Italian, last_id of language_item) -> language 

    (Auto_Generated_num, description, productDescription in English, 
    productDescription in French, productDescription in Italian, 
     last_id of language_item) -> language 

是否有人在這裏可以幫我這個結構的改變,使之更好但從設計和性能上來看,甚至有經驗多語言網站,併爲我提供更好的解決方案

在此先感謝

回答

1

沒有頂住對方的答案在本網站類似的問題,我想出了下面的模式多語言支持:

 +---------------+ 
    | PRODUCTS_B | 
    +---------------+ 
    | product_id | 
    | product_code | 
    | ...   | 
    +---------------+ 
      | 
      | 
+-------------------------+ 
| PRODUCTS_T    | +---------------+ 
+-------------------------+ | LANGUAGES  | 
| product_id    | +---------------+ 
| translation_language_id |----| language_id | 
| product_name   | | language_code | 
| product_desc   | +---------------+ 
| ...      |   | | 
+-------------------------+   | | 
      |      | | 
      |      | | 
+-------------------------+   | | 
| PRODUCTS_L    |   | | 
+-------------------------+   | | 
| product_id    |   | | 
| language_id    |----------+ | 
| translation_language_id |--------------+ 
+-------------------------+ 

語言包含了所有你希望在應用程序支持的語言,它有一個主LANGUAGE_ID的鍵:

1 ENG 
2 FRA 
3 ITA 

PRODUCTS_B包含每個產品的非翻譯的屬性,它具有PRODUCT_ID的主鍵:

1 PROD/0A 

A記錄將被插入到PRODUCTS_T對於每個可用翻譯,它具有PRODUCT_ID和translation_language_id的化合物主鍵:

1(PROD/0A) 1(ENG) Computer A programmable device 

的記錄將被插入到PRODUCTS_L爲每個支持的語言;表明這是翻譯使用;它具有PRODUCT_ID和LANGUAGE_ID的化合物主鍵:

1(PROD/0A) 1(ENG) 1(ENG) 
1(PROD/0A) 2(FRA) 1(ENG) 
1(PROD/0A) 3(ITA) 1(ENG) 

PRODCUTS_L應包含在PRODUCTS_B和語言的笛卡爾乘積的每一個值。

由於翻譯成了可供PRODUCTS_T和PRODUCTS_L表中的記錄將被適當修改:

1(PROD/01) 1(ENG) Computer A programmable device 
1(PROD/0A) 2(FRA) Ordinateur Un dispositif programmable 

1(PROD/0A) 1(ENG) 1(ENG) 
1(PROD/0A) 2(FRA) 2(FRA) 
1(PROD/0A) 3(ITA) 1(ENG) 

而最終:

1(PROD/01) 1(ENG) Computer A programmable device 
1(PROD/0A) 2(FRA) Ordinateur Un dispositif programmable 
1(PROD/01) 3(ITA) Computer Un dispositivo programmabile 

1(PROD/0A) 1(ENG) 1(ENG) 
1(PROD/0A) 2(FRA) 2(FRA) 
1(PROD/0A) 3(ITA) 3(ITA) 

我用這個方法,我沒有每在產品信息被插入時可用的翻譯。它還表示,如果有多個但不是全部的翻譯版本,那麼應該爲每種語言使用哪種翻譯。

+0

感謝您的詳細和描述性答案,這個解決方案結構更好,比我的結構更完善,但我仍然有點困惑Products_L表應該做些什麼?似乎一切工作正常,只是沒有它 還有一件事,以及你必須創建Categories_T和Categoreis_L的類別以及 換句話說,每個單表需要翻譯2個額外的表 – Siavosh

+0

如果只有一個PRODUCTS_T表格,那麼如果翻譯不可用,您可能會錯過它 - 這在我的應用程序中是不可接受的 - 或者您將一種語言的翻譯重複爲缺少的語言 - 這不是標準化的設計。 PRODUCTS_L表的引入爲每種支持語言的語言相關屬性提供了標準化設計和值。一般來說,設計越規範化,表格的數量就越多。 – DrabJay

+0

雖然我的問題可能沒有一個正確的答案,它是關於在特定情況下的最佳做法和設計,但由於您的設計已正常化,我認爲它是正確的,謝謝你的時間 – Siavosh

0

我會在一個分開的表格中維護語言,例如obj_lang(PK,objPK,langPK),只有一個應用程序工廠知道所選擇的lang才能夠正確的選擇...

相關問題