SQL多对多关系

时间:2015-03-31 21:37:05

标签: mysql sql-server

问题

有没有办法在不使用自动增量器(通常为ID)的情况下在3个表之间建立多对多关系,或者是否需要ID?

为什么我要求

我有3个相对表格。由于一对一的关系似乎不能直接发生,所以我做了第4次与其他3个表做一对多的关系。但是,由于每个表仍然有一个主键,因此一个值只能在表中使用一次,我不希望这样。

我有什么

2 个答案:

答案 0 :(得分:1)

是的,你可以,但

习惯上用唯一标识符表示一个表行,这是一个数字,它变得更有效率。

答案 1 :(得分:1)

不要求表格具有"自动增量器"作为主键。

但是,熟悉的模式是将代理ID列添加为实体表的主键。 "理想"主键将是"匿名" (没有任何有意义的信息),"独特的" (没有重复的值),"简单" (单列,短简单本机数据类型),...

关于引入替代密钥是否是一个好主意,有几种思想流派。我还要注意的是,有些人后来被决定使用自然密钥而不是代理密钥而被烧毁。还有那些尚未被这个决定烧毁的东西。


在"关联"的情况下表(为解决多对多关系而引入的表),外键的组合可以用作主键。我经常这样做。

但是,如果关联表本身证明是实体表,并且具有它自己的属性,我将引入一个代理ID列。例如,personclub之间的关联,一个人可以是多个俱乐部的成员,俱乐部可以有多个成员......

club +--< membership >--+ person

当我们开始向membership添加属性时(例如statusdate_joinedoffice_held等等......此时membership isn&#39 ;只是一个关联表;它变成了一个实体。当我怀疑一个关联实际上是一个实体时,我就添加了代理ID列。

我将向代理表添加代理ID列的另一种情况是,当我们要允许&#34;重复&#34;时,我们希望允许多个关联。在这种情况下,我还将介绍一个代理ID列。