2

我目前正在開發一個網站,其中某些動態數據必須以各種語言提供。現在的語言是三種,但是想法是在未來增加更多。這是數據庫中多語言數據的正確答案嗎?

想象一下,你有一個頁面,並希望提供三種不同語言的內容的第一種情況。我的數據庫中的網頁存儲這樣的:

Pages UML

因爲對我有每一種語言,我創建的網頁新翻譯的內容這個偉大的工程。

但是,隨着項目的進展,我發現更多需要翻譯數據的情況。下圖是具有類型,子類型和狀態的產品示例。所有這些數據必須以所有不同的語言提供。

Products UML

這是不是有點大材小用,因爲我將最終只持有ID的例如表?對於每個需要保存翻譯內容的表格,我都需要一個新的表格。

有沒有更好的方法?

+1

我建議不要過於通用,並會失去正確的外鍵實施。請看[這篇文章](http://stackoverflow.com/a/14838175/533120)瞭解更多信息。 –

+0

@BrankoDimitrijevic通過這種結構,編寫查詢的最佳方式是什麼?爲了獲得所有類型,我想:'SELECT type_text FROM TypesTranslations JOIN(語言,類型)ON(TypesTranslations.language_id = Languages.language_id AND TypesTranslations.type_id = Types.type_id)WHERE Languages.language_code ='en''最大問題是,例如,檢索產品的所有信息或獲取按類型排序的所有子類型(因爲where子句中的列'language_id'不明確)。 –

+0

我不知道你想如何檢索類型,但這與翻譯無關。但是,您可以檢索該類型,只需在'type_id'上使用'TypeTranslation'加入它,然後按照所需的'TypeTranslation.language_id'進行過濾。 –

回答

2

如果你願意犧牲一些外鍵和「數據庫純度」你可以這樣做:

CREATE TABLE LocalizedTexts(OwnerType byte PK, OwnerID int PK, LanguageID int PK, Text string) 

對於每一個「老闆」(產品,StatusNames,類型......),你分配一個整數常量OwnerType。在LocalizedTexts中,您有一個由主人類型,所有者ID(例如ProductIDStatusNameIDTypeID,...)和語言ID組成的主鍵。

OwnerType在案件中歧義消除OwnerID不是唯一的(因爲它來自多個表)。

這是一個很好的可擴展和標準化模式。唯一的缺點是你不能在這裏有一個FK。

+0

您是否願意解釋最後一句「唯一的缺點是您不能在這裏擁有FK」。 –

+2

例如,您不能鏈接'LocalizedTexts'和'Products',因爲'OwnerID'也包含其他表的ID。我認爲這是一個小小的缺點。 – usr

+1

我們使用這種方法來處理數據庫中的其他內容,如評論,標籤等。我認爲這讓事情變得很簡單。 – Remy

1

我認爲這取決於您是否需要對新語言採用「動態」方法,或者您基本知道您的應用需要支持多少種語言。

我們只需要爲每一個語言列:

Create table Product (int id, text name_de, text name_en, etc...) 

但是,這意味着,如果你添加一個新的語言,你必須改變你的DB模式了一下。 但使編程更簡單,查找速度更快。

此解決方案與@ usr之間的區別在於,在他的解決方案中,您可以在不更改數據庫的情況下添加語言。我的解決方案需要架構更新,每次添加新語言。例如。瑞士的大多數公司都有3種,也許4種語言的網站,他們保持這種狀態。所以,這個解決方案有效。但是如果你不斷添加語言,那麼這有點複雜。