2011-12-27 47 views
1

我正在處理食譜模塊(ASP.NET MVC,實體框架,sql server),並且我必須在數據庫中設置的實體之一是成分,它們的特徵以及翻譯成多種語言。如何設計我的成分數據庫表?

我想創建兩個表如下:

Table Ingredient 
    Id, nvarchar(20), primary key 
    EnergyInKCal, float 
    ... other characteristics 
    Source, nvarchar(50) 

Table IngredientTranslation 
    Id, nvarchar(20), primary key 
    LanguageCode, nvarchar(2) 
    Name, nvarchar(200) 

所以每種成分會在成分表中定義一次,有一個獨特的代碼作爲其主鍵,例如:

'N32-004669', 64, 368, 'NUBEL' 

並翻譯在IngredientTranslation臺,例如

'N32-004669', 'NL', 'Aardappel, zoete' 
'N32-004669', 'FR', 'Pomme de terre, douce' 
'N32-004669', 'EN', 'Potatoe, sweet' 

我噸hink查詢成分變得這麼簡單......你認爲使用代碼(這是nvarchar(20))作爲主鍵是個好主意嗎?或者是一個簡單的bigint更好,但是我必須在我的查詢中使用JOINS。也許其他更好的方法 - 性能明智嗎?

編輯:閱讀的答案後,我重新設計了表格如下:

Table Ingredient 
    Id, bigint, primary key 
    ExternalId, nvarchar(20) 
    EnergyInKCal, float 
    ... other characteristics 
    Source, nvarchar(50) 

Table IngredientTranslation 
    Id, bigint, primary key 
    IngredientId, bigint (relation with Id of Ingredient table) 
    LanguageCode, nvarchar(2) 
    Name, nvarchar(200) 

感謝, 大號

+1

那麼,你認爲你如何通過使用'nvarchar'來避免JOIN? – 2011-12-27 12:48:04

+0

好吧,因爲每個配方都存儲代碼,所以如果我想檢索特徵和名稱,我可以使用'代碼'(和語言)來查詢? – 2011-12-27 12:50:39

+1

所以你正在考慮做一個額外的查詢? 1.沒有關於整數ID的信息,這使得它們比查詢數據庫的nvarchars更不合適。 2. OFG NOOO! *不要做額外的查詢,使用連接要快得多!* – 2011-12-27 12:52:23

回答

2

由於主鍵中包含所有其他指數,這是最好的保持原關鍵小。所以int identity是一個很好的選擇。

一面說明:將翻譯存儲在數據庫中會帶來相當大的性能影響。數據庫和必須構建網頁的渲染引擎。由於翻譯相當穩定,大多數網站將它們存儲在數據庫之外。在ASP.NET中,典型的選擇是資源文件。

+0

謝謝。你是說我應該添加一個Id(bigint)作爲主鍵而不是varchar,並且在我的查詢中使用JOINS?關於資源文件:因爲用戶可以定義自定義成分,資源文件可能不是很靈活... – 2011-12-27 12:42:16

+0

另外,請參閱我的編輯以獲取其他問題 – 2011-12-27 12:46:24

+0

是的。一個連接的查詢通常比多個單獨的查詢快得多。 RE編輯:是的,一個代理鍵被添加到列列表中,它不會替換varchar id。 – Andomar 2011-12-27 12:49:49

1

在純粹的關係模式中,使用自然鍵(如上面的ID)作爲主鍵應該沒問題,儘管OO設計中的替代鍵可能是首選。

一對夫婦的產生額外注意事項:

  • 上IngredientTranslation主鍵將需要對ID的複合鍵和語言代碼,而不僅僅是ID。
  • 從第一範式:刪除派生值。因此,您只需要一個能量場 - 選擇一個能量單位(kJ或kCal),並使用適當的乘法因子在適當的位置進行轉換。

編輯:在另一種情況下,我建議在每種成分(代碼)和IngredientTranslation(代碼和語言代碼)表中添加一個唯一索引。我還建議在IngredientTranslation表中將代碼字段重命名爲IngredientCode。

+0

確實,在翻譯表中它將是一個複合鍵。你的第二個評論當然是有效的,我的例子是不正確的。我不會把冗餘數據放在那裏... – 2011-12-27 12:44:17

+0

另外,請參閱我的編輯其他問題 – 2011-12-27 12:46:38