我正在研究配方模块(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)
谢谢, →
答案 0 :(得分:2)
由于主键包含在每个其他索引中,因此最好保持主键较小。所以int identity
是一个很好的选择。
一方面注意:在数据库中存储翻译会对性能产生相当大的影响。数据库和必须构建网页的渲染引擎。由于翻译相当稳定,大多数网站将它们存储在数据库之外。在ASP.NET中,典型的选择是资源文件。
答案 1 :(得分:1)
在纯粹的关系模式中,使用自然键(例如上面的ID)作为主键应该没问题,尽管在OO设计中,代理键很可能是首选。
一些附加说明:
编辑:在替代方案中,我建议为每个成分(代码)和成分翻译(代码和语言代码)表添加唯一索引。我还建议在IngredientTranslation表上将代码字段重命名为IngredientCode。