我应该在哪里存放外键?

vic*_*tcu 20 mysql database database-design data-modeling

如果我在两个表之间有关系(两个表都有自己的主键),那么应该指导我决定哪个表应该存储外键?我知道这种关系的本质可能很重要(一对一,一对多,多对多,单向,双向),而且访问模式也很重要.虽然做出决定的系统方法是什么?

OMG*_*ies 26

哪个表是关系中的孩子?
回答这个问题,你知道哪个表需要外键列,引用父代的[通常]主键.这是一对多的关系......

多对多会要求您添加第三个表,使用两个表中的键作为主键.

  • 或者它是一对一的关系,OP应该问自己为什么它首先分成两个表. (6认同)
  • ......如果没有孩子/父母的关系.它在连接表中可能是多对多的. (4认同)

S.L*_*ott 8

"虽然做出这个决定的系统方法是什么?"

似乎有两种选择:"一边"作为FK到"多边",或者"多边"一边有FK到"一边".

让我们真正看看选择.

  • "多"侧的所有行都可以轻松地引用"一"侧的一行.

  • "一"侧的一行不能引用"多"侧的所有行.

只有一种技术可行:"很多"方面有FK到"一"方.

只有一个实际的实现选择.没有"决定".

  • 简而言之:这是基数问题.如果你有多对一的关系,那么密钥应该位于'many'侧.如果它是"一个"或"一个",则在"一个"侧.如果是多对多,则需要一个中间表.如果它是一对一的,你可以自由选择. (3认同)

Bar*_*own 5

外键只是一个表中的一个字段,它引用了另一个表的一个键字段。像这样识别外键字段并不是绝对重要的。也就是说,您不需要将 FOREIGN KEY ... REFERENCES 约束显式添加到表中,使其成为外键。当您将两个表连接在一起时,父表的主键将设置为等于子表的外键。哪个不是主键就是外键。

在一对多关系中,FK 站在“多”方面。它不能在“一个”方面进行,因为那是 PK 的所在,并且主键的定义包括不允许重复。

如果您有一个多对多关系,您将需要重新处理这些表,以便最终得到两个一对多关系和一个中间解析表。