N-M关系中的复合主键与否?

时间:2010-06-03 18:00:01

标签: sql sql-server linq-to-sql query-optimization

让我们说我们有3张桌子(实际上我现在有2张桌子,但这个例子可能会更好地说明这个想法):

[人]

  • ID:int,主键
  • 名称:nvarchar(xx)

[组]

  • ID:int,主键
  • 名称:nvarchar(xx)

[作用]

  • ID:int,主键
  • 名称:nvarchar(xx)

[PersonGroupRole]

  • Person_ID:int, PRIMARY COMPOSITE OR NOT?
  • Group_ID:int, PRIMARY COMPOSITE OR NOT?
  • Role_ID:int, PRIMARY COMPOSITE OR NOT?

关系 PersonGroupRole 中的3个ID中的任何一个是否应该标记为PRIMARY键,还是应该将它们全部3组合成一个复合?这样做的真正好处是什么?

据我所知,我可以加入,所以Person JOIN PersonGroupRole JOIN Group给了我哪些人在哪些组等。

我将在SQL-express和SQL-server之上使用LINQ / C#/ .NET,因此如果有任何关于语言/ SQL的原因可能会使选择更加明确,那就是我要求的平台。 / p>

期待看到弹出的答案,因为我在制作组合时会多次考虑这些主键/索引。

编辑:

好的,问题是我现在可以看到被误解了。

问题在于,如果将PersonGroupRole中的三个ID标记为PRIMARY KEYS用于索引目的是有意义的。这是否会为连接三个表中的每个表增加额外的速度,或者它们是否应该在PersonGroupRole表中没有PRIMARY KEY而在单独的表中只是Primary。

对不起,关于混乱。将尝试更好地解释我的问题。

3 个答案:

答案 0 :(得分:6)

复合键清楚地标识每一行(假设一个人在同一组中不能两次具有相同的角色),因此它可以生成一个好的主键。

是否实际将其声明为物理主键虽然取决于您正在使用的工具以及这些表周围的其余数据库。你有很多其他表有FK到这个表吗?如果是这样,那么代理密钥可能是有序的。

答案 1 :(得分:2)

这取决于关系是什么:

  • 一个人可以在多个团体中吗?
  • 有多个角色?
  • 角色/群组1:1,此组合中有多人?

最有可能的是,你需要更多的桌子和4NF或5NF来捕捉这个

Example here,但我最好的链接现在是一些糟糕的链接页面抱歉。 Another that describes my questions somewhat

答案 2 :(得分:2)

问题似乎是基于对密钥的基本误解。应该清楚的是,将这些列中的一列作为密钥而不是所有三个列上的复合键将完全改变表的含义和潜在用途。分析业务需求并了解您正在建模的实际情况应该确定哪些列是唯一的。不幸的是,这个问题并没有说明数据模型实际需要什么,所以我认为它无法以任何有意义的方式解决。