如何设计我的成分数据库表?

时间:2011-12-27 12:29:57

标签: sql sql-server asp.net-mvc-3 entity-framework primary-key

我正在研究配方模块(ASP.NET MVC,实体框架,sql server),我必须在数据库中设置的实体之一是成分,它们的特性以及多种语言的翻译。 / p>

我正在考虑创建两个表,如下所示:

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' 

我认为查询成分就像这样容易......你认为使用代码(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)

谢谢, →

2 个答案:

答案 0 :(得分:2)

由于主键包含在每个其他索引中,因此最好保持主键较小。所以int identity是一个很好的选择。

一方面注意:在数据库中存储翻译会对性能产生相当大的影响。数据库和必须构建网页的渲染引擎。由于翻译相当稳定,大多数网站将它们存储在数据库之外。在ASP.NET中,典型的选择是资源文件。

答案 1 :(得分:1)

在纯粹的关系模式中,使用自然键(例如上面的ID)作为主键应该没问题,尽管在OO设计中,代理键很可能是首选。

一些附加说明:

  • IngredientTranslation上的主键需要是ID和语言代码的复合键,而不仅仅是ID。
  • 从第一范式:删除派生值。因此,您只需要一个能量场 - 选择一个能量单位(kJ或kCal)并使用适当的倍增因子进行适当的转换。

编辑:在替代方案中,我建议为每个成分(代码)和成分翻译(代码和语言代码)表添加唯一索引。我还建议在IngredientTranslation表上将代码字段重命名为IngredientCode。