2

我正在使用 ASP.NET 和实体框架来制作网站。我目前有一个映射表,用于...假设用户和足球队之间的多对多关系。所以:

用户
团队用户
团队

第 1 部分:为映射表的主键使用复合键是最佳实践吗?换句话说:

UserTeams
PK UserId
PK TeamId
PreferenceId

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

UserTeamPredictions
PK UserTeamPredictionId
FK UserId
FK TeamId
预测 PredictionYear

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

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

UserTeams
PK UserTeamId
FK UserId
FK TeamId
PreferenceId

UserTeamPredictions
PK UserTeamPredictionId
FK UserTeamId
预测 PredictionYear

你怎么看!?

4

2 回答 2

4

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

于 2009-07-23T21:06:38.240 回答
2

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

这样做的好处是可以为您提供良好的连接性能,并且意味着您始终知道给定表的键(表名 + ID),而无需参考架构。一些 ORM 工具也只能在单列而不是复合键上正常工作。

于 2009-07-23T21:05:22.330 回答