我应该在哪里存放外键?

时间:2010-07-20 19:50:49

标签: mysql database database-design data-modeling

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

4 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:8)

  

“制定这个决定的系统方法是什么?”

似乎有两种选择:“一方”一侧作为FK指向“多面”,或“多面”一面具有FK指向“一侧”。

让我们真正看一下选择。

  • “多”一侧的所有行都可以轻松引用“一”侧的一行。

  • “One”一侧的一行不能引用“Many”一侧的所有行。

只有一种技术有效:“很多”方面有FK到“一”方。

只有一个实际的实现选择。没有“决定”。

答案 2 :(得分:2)

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

在一对多关系中,FK走向“很多”方面。它无法进入“一”方面,因为PK就是这样,主键的定义包括禁止重复。

如果您有多对多的关系,则需要重新处理表格,以便最终得到两个一对多关系和一个中间分辨率表。

答案 3 :(得分:0)

primary key类似,foreign key也是放置在表格中一列或多列上的constraint类型。

foreign key在另一个表中的键列和相关列之间建立链接。 (您还可以将外键列链接到同一个表中的列。)

包含外键的表被视为子表,外键引用的表是父表。

要点

  1. foreign key必须引用主键或唯一约束,尽管该引用可以位于同一个表或不同的表中
  2. foreign key必须与引用的约束中的列数具有相同的列数,并且数据类型必须在相应的列之间匹配。
  3. Primary key不同,Foreign key列可以包含 NULL 值。