2011-11-13 47 views
0

我有一個包含多種語言的產品及其描述的表格。對於現在的表結構是這樣的數據庫設計 - 多個文本字段

tblProducts

productId INT PK AI 
productDesc_en VARCHAR 
productDesc_de VARCHAR 
productDesc_it VARCHAR 

等。 en是英語,de是德語

因此,根據他的語言設置來訪問者,看他的語言描述。

想知道,存儲這樣的數據有什麼好處嗎?

tblProducts

productId INT PK AI 

tblProductDesc_en

descId INT PK AI 
tblProducts_productId INT FK 
description VARCHAR 

tblProductDesc_de

descId INT PK AI 
tblProducts_productId INT FK 
description VARCHAR 

tblProductDesc_it

descId INT PK AI 
tblProducts_productId INT FK 
description VARCHAR 

親(一個或多個)1在該溶液中看到:

  1. 更容易從DB透視維持
  2. 從DB記錄實例化對象時(因爲只有需要使用較少的存儲器語言 將被存儲在一個對象內)

The con(s):

  1. 必須使用JOIN獲取可能達到性能的所需數據;
  2. 更復雜的getter和setter從類

別的內?

謝謝!

+0

爲什麼不只有一個'tblProductDesc',併爲'tblProductDesc_lang'添加一列?併爲每種語言保存一個新行? –

+0

@JaredFarrish,它與第二種解決方案有什麼不同?我仍然必須使用連接來獲取正確的結果。此外,我將不得不存儲大量空列,其中沒有特定語言的描述。 – paulus

+0

第二你的解決方案,你指的是在你的問題?你說的是有多個表具有相同的確切列,唯一的區別是關於行(語言)的屬性。你不必有任何空行(不知道你爲什麼這麼想)。保存說明時,爲每種可用語言添加一行。 –

回答

2

我認爲只有一個帶語言標誌的額外表格會是一個非常接近標準化的好解決方案,在添加新語言時提供更堅實的db圖表。

這將是這樣的:

CREATE TABLE `language` (
    `prodID` INT UNSIGNED NOT NULL , 
    `desc` varchar(30) null , 
    `lang` char(2) NOT NULL, 
    PRIMARY KEY (`prodID`,`lang`), 
    CONSTRAINT `fk0` FOREIGN KEY (`prodID`) 
     REFERENCES `product` (`prodID`) 
     ON DELETE CASCADE 
) ENGINE=InnoDB ROW_FORMAT=COMPACT; 

外鍵將提供完整的產品時,會刪除也允許插入時,產品才存在。

組合主鍵將使得語言和產品的說明僅存儲一次。

就依賴性而言,這個主鍵對我來說看起來不錯,回顧db的講座很好,因爲非主鍵字段依賴於主鍵的兩個部分,我的意思是需要兩個部分被識別。

你有相同的字段作爲主鍵和外鍵的一部分,就像借用這部分主鍵一樣。

==========編輯1(上面沒有更改)============== 我會在desc字段中將Null替換爲Not Null。那麼如果產品存在並且描述不是這意味着沒有描述可用。這是我的意見,沒有理由允許上面的空desc。

0

對於您現有的情況,最大的意義在於您何時需要添加一種語言。當前解決方案中的更改可能會比將語言分離出來更廣泛和更脆弱。

有一種替代解決方案是您的兩個建議之間的一半,它減少了建議的解決方案缺點的影響。這是爲了在產品描述中將一種語言作爲默認語言,並在不同的表中使用替代語言。這確實假定大多數用戶將訪問您的數據庫的一種語言。

+0

與你的解決方案 - 這假設我在構造函數方法中獲取描述?然後,如果描述與語言不匹配,則必須調用單獨的方法來獲取正確的描述,或者以某種方式創建動態查詢以在構造函數執行期間檢測語言。恐怕這會讓它變得更加複雜。我在第二種方法中看到的另一個專業人員是,我不必從構造函數(我通常儘可能少地給構造函數給出構造函數)進行描述,而是根據語言從單獨的方法獲取描述。 – paulus