2013-02-12 67 views
1

我們想擴展我們的數據庫來創建多語言支持,但我們不確定如何執行此操作。 我們的數據庫看起來是這樣的:添加信息,xml列或新表?

ID - 名稱 - 說明 - (很多不相關的列)

選項1是一個XML列添加到表,在這個專欄中,我們可以存儲我們需要的信息像這樣:

<translation> 
    <language value=’en’> 
     <Name value=’’> 
     <Description value=’’> 
    </language> 
    <language value=’fr’> 
     <Name value=’’> 
     <Description value=’’> 
    </language> 
</translation> 

這樣做的好處是,當我刪除行時,我也刪除了翻譯。

選項2是添加一個額外的表,很容易創建一個表來存儲信息,但它需要內部連接時獲取信息和更多的努力刪除行時刪除原來的行。

這種情況下的首選選項是什麼?或者還有其他好的解決方案嗎?

+0

如果您有另一個表,如果您使用外鍵並且引用操作觸發了'ON DELETE CASCADE',當您從主表中刪除行時,它將刪除行附加表。這可能是一個太主觀的問題,但是我會說使用一個額外的表,這是關係數據庫的全部要點,您可以在附加表上使用索引,約束等,但不能在XML列上使用。如果您需要XML格式的數據,將其轉換爲XML並不困難。 – GarethD 2013-02-12 15:58:13

+0

您也可以使用'NVARCHAR2'數據類型將多語言數據存儲在單個列中 – Incognito 2013-02-12 16:08:16

回答

3

我推薦的「關係」的方式,即獨立的轉換表(一個或多個)。考慮做這樣的:

enter image description here

這種模式有一些很不錯的屬性:

  • 對於每一個多語種的表,創建一個單獨的翻譯表。這樣,您可以使用適合該特定表的字段,並且翻譯不能與錯誤的表「錯誤連接」。
  • 的語言表和相關的外鍵的存在,確保了翻譯不存在不存在的語言,不同的是XML。可以留給
  • ON DELETE CASCADE參照動作將確保沒有「孤立」的翻譯,當語言被刪除的背後,不像XML。
  • 儘管XML在更簡單的情況下可能會更快,但我懷疑JOIN在語言數量增長時更具可擴展性。 在任何情況下,措施的差異,自己決定它是否夠顯著。
  • 單獨的字段,例如NAME和DESCRIPTION可能更易於索引。使用XML,您可能需要一個DBMS,特別支持XML,或者可能需要某種全文索引。
  • 諸如NAME和DESCRIPTION之類的字段可能只是普通的VARCHAR。 OTOH將它們放在一起可能會產生對於常規VARCHAR來說太大的XML,從而迫使您使用CLOB/BLOB,這可能會有其自身的性能問題。
  • 如果您的數據庫管理系統支持羣集(見下文),整個轉換表可以存儲在一個B樹中。 XML有很多冗餘數據(開始和結束標記),可能會使它比B-Tree更大,緩存更少(即使我們計算了所有相關開銷)。

你會發現,上面的模型使用identifying relationships所得PK:{LANGUAGE_ID,TABLEx_ID}可用於clustering(使屬於同一語言存儲物理併攏在數據庫中的譯文) 。只要你有少數優勢(或「熱」)的語言,這應該是好的 - 緩存是在數據庫頁面級完成的,所以避免在同一頁面中混合「熱」和「冷」數據避免緩存「冷「數據(並使緩存」變小「)。

OTOH,如果您經常需要查詢多種語言,請考慮將集羣鍵順序翻轉爲:{TABLEx_ID,LANGUAGE_ID},以便將同一行的所有翻譯物理上緊密地存儲在數據庫中。一旦您檢索到一個翻譯,同一行的其他翻譯可能已被緩存。或者,如果您想在單個查詢中提取多個翻譯,則可以用較少的I/O來完成。


我們可以加入剛剛在所需的語言翻譯。使用XML時,必須加載(並解析)整個XML,然後才決定只使用與所需語言相關的一小部分XML。無論何時添加新的語言(以及相關的XML翻譯),即使您很少使用新語言,也會減慢現有行的處理速度。