我应该使用复合键作为映射表,也用于外键吗?

时间:2009-07-23 21:00:33

标签: asp.net entity-framework foreign-keys primary-key composite-key

我正在使用ASP.NET和Entity Framework来创建一个网站。我目前有一张地图表,用于表示用户和足球队之间的多对多关系。所以:

用户
团队
用户团队

第1部分:最佳做法是使用复合键作为地图表的主键吗?换句话说:

UserTeams
PK UserId
PK TeamId
PreferenceId

第2部分:需要注意的是,我还有另一张桌子。我们称之为“UserTeamPredictions”,它存储每年给定团队的用户预测。该表有一个指向映射表的外键。所以它看起来像这样:

UserTeam预测
PK UserTeamPredictionId
FK UserId
FK TeamId
预测 PredictionYear

这似乎在实体框架中工作正常,但是,在我使用像Telerik这样的第三方控件中引用关系时遇到了一些问题。即使它可能不是理想的数据设置,我是否应该更改表结构/关系,以便在具有数据绑定和其他功能的代码中更容易使用?

更改是将一个整数主键添加到UserTeams映射表,允许UserTeamPredictions表直接引用该键,而不是像当前那样通过复合键引用:

UserTeams
PK UserTeamId
FK UserId
FK TeamId
PreferenceId

UserTeam预测
PK UserTeamPredictionId
FK UserTeamId
预测 PredictionYear

您怎么看??

2 个答案:

答案 0 :(得分:4)

你应该改变它。搜索堆栈溢出以讨论“自然键” - 几乎普遍认为代理键更好,特别是在使用实体生成时。通常,自然或复合键可以很好地与实体框架样式DAL层一起使用。例如,Lightspeed和Subsonic都要求你有一个唯一的列作为PK ... Lightspeed in it的当前版本甚至到目前为止坚持你的列被称为“Id”,尽管这将改变下一个版本。 / p>

答案 1 :(得分:2)

我会选择不这样做。我将使用代理键并在UserId和TeamId列上放置一个唯一索引。当有两个以上的时候,我真的厌倦了复合键,而不是混合使用复合键和代理键,我选择尽可能使用所有代理,无意义的自动增量键。

这有助于您在连接上获得良好的性能,并且意味着您始终知道给定表的密钥(表名+ ID),而无需引用模式。有些ORM工具也只能使用单列而不是复合键。