如果我在两个表之间有关系(两个表都有自己的主键),那么应该指导我决定哪个表应该存储外键?我知道这种关系的本质可能很重要(一对一,一对多,多对多,单向,双向),而且访问模式也很重要。制定这个决定的系统方法是什么?
答案 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
在另一个表中的键列和相关列之间建立链接。 (您还可以将外键列链接到同一个表中的列。)
包含外键的表被视为子表,外键引用的表是父表。
要点
foreign key
必须引用主键或唯一约束,尽管该引用可以位于同一个表或不同的表中foreign key
必须与引用的约束中的列数具有相同的列数,并且数据类型必须在相应的列之间匹配。Primary key
不同,Foreign key
列可以包含 NULL 值。