2017-07-11 119 views
0

我對這個「簡單」的數據庫設計有點困惑。也許有人有一個更好的主意。我需要設計一個幫助系統符合以下要求:數據庫模型:如何設計多語言幫助系統數據庫?

  • 幫助內容具有標題
  • 幫助內容擁有內容
  • 幫助內容是多語言(標題和內容)
  • 一在英語的幫助內容爲強制性
  • 英語幫助內容始終作爲後備使用時,不同語言的內容不可用
  • 幫助內容可以被分配到多個類別

enter image description here

似乎是一個非常簡單的模型,但我的問題是下面

1)英語是後備語言,總是需要先創建可以創建其他語言之前,使用ParentId是否是一個好的設計?

2)如何使用回退語言進行查詢?我的意思是讓我們假設用戶選擇了西班牙語作爲他的首選語言。但對於西班牙語,一些內容不以西班牙語存在,但僅以英語存在。我如何查詢現有西班牙語的項目,但也返回只有英語內容沒有西班牙兒童的項目。

回答

0

我有你的圖上幾點意見:對之間HelpContentHelpContent_Categories是不正確的連接

你們的關係基數(僅在圖中)。 許多關係的末尾應該附加到相交的實體類型(HelpContent_Categories)。外鍵是在正確的位置,但該行繪製不正確。

HelpContentLanguage之間的基數不正確。您顯示1:1,但基數應爲1:M。總體而言,我會以不同的方式處理這些陳述的要求。我將強制性的英文內容作爲一張表格,所有譯文都是與Language相交的單獨表格。您可以將這種安排平鋪到您使用ParentId顯示的表格中,但這可能會造成混淆。它當然不會使用模式來強制執行您的業務規則,即英語是強制性的,而所有其他語言都是可選的。

考慮這個ERD: ERD

的英文內容是在CategoryHelpContent表。所有的翻譯值都在Language的交集表中。

要用任何給定的語言查詢幫助,請用翻譯表的OUTER JOIN主表/英文表,然後將翻譯的和英文值合併在一起。如果翻譯存在,那麼你會得到翻譯。如果它不存在,你會得到英語作爲後備。

我不得不承認,它揉了我一個錯誤的方式來擁有兩個表而不是一個表,但它確實用模式強制執行了您的業務規則,而不是必須編寫和維護的額外代碼。

+0

嗨喬爾。謝謝你的答案。我是否正確理解我在「幫助內容」表中有主要的英語內容,然後在「內容翻譯」表中具有主要英語項目的ID和另外的語言ID? – STORM

+0

@STORM是的。主要英文內容位於'HelpContent'表中,翻譯的內容位於'ContentTranslation'表中,外鍵爲'HelpContent'(例如HelpContentId),外鍵爲'Language'(例如LanguageId或代碼,或任何你使用的) –