2

我正在使用ASP.NET和Entity Framework来制作一个网站。我目前有一张地图表,用来表示用户和足球队之间的多对多关系。所以:我是否应该将复合键用于映射表,该映射表也用于外键?

用户

UserTeams

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

UserTeams
PK用户ID
PK TeamId
PreferenceId

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

UserTeamPredictions
PK UserTeamPredictionId
FK用户ID
FK TeamId
预测 PredictionYear

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

的变化将是通过复合键的整​​数主键添加到UserTeams映射表,从而允许UserTeamPredictions表直接引用键,而不是作为它目前的作用:

UserTeams
PK UserTeamId
FK用户ID
FK TeamId
PreferenceId

UserTeamPredictions
PK UserTeamPredictionId
FK UserTeamId
预测 PredictionYear

你觉得什么!

回答

2

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

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

+0

我切换到使用代理,迄今一直工作得很好。谢谢。 – 2009-07-27 15:34:18

4

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

+0

感谢您的意见! – 2009-07-27 15:35:05