Mysql 我应该在哪里存储外键?
如果我在两个表之间有关系(两个表都有自己的主键),那么在决定哪个表应该存储外键时,应该以什么为指导?我知道关系的性质可能很重要(一对一、一对多、多对多、单向、双向),访问模式也可能很重要。但是,做出这种决定的系统方法是什么?哪张表是关系中的子表?Mysql 我应该在哪里存储外键?,mysql,database,database-design,data-modeling,Mysql,Database,Database Design,Data Modeling,如果我在两个表之间有关系(两个表都有自己的主键),那么在决定哪个表应该存储外键时,应该以什么为指导?我知道关系的性质可能很重要(一对一、一对多、多对多、单向、双向),访问模式也可能很重要。但是,做出这种决定的系统方法是什么?哪张表是关系中的子表? 回答这个问题,您就知道哪个表需要外键列,引用父表的[通常]主键。这是一对多的关系 多对多需要添加第三个表,使用两个表中的键作为主键。外键只是一个表中引用另一个表的键字段的字段。识别外键字段本身并不是绝对重要的。也就是说,您不需要显式地添加外键。。。引用
回答这个问题,您就知道哪个表需要外键列,引用父表的[通常]主键。这是一对多的关系
多对多需要添加第三个表,使用两个表中的键作为主键。外键只是一个表中引用另一个表的键字段的字段。识别外键字段本身并不是绝对重要的。也就是说,您不需要显式地添加外键。。。引用表的约束,使其成为外键。将两个表联接在一起时,父表的主键将设置为等于子表的外键。无论哪个不是主键,都是外键 在一对多关系中,FK站在“多”一边。它不能放在“一”端,因为PK就放在这一边,主键的定义包括禁止重复 如果有多对多关系,则需要重新处理这些表,以便最终得到两个一对多关系和一个中间分辨率表
“但是,做出这一决定的系统方法是什么?” 似乎有两种选择:“一”侧作为FK的“多”侧,或“多”侧具有FK的“一”侧 让我们来看看这些选择
- “多”侧的所有行都可以很容易地引用“一”侧的一行
- “一”侧的一行永远无法引用“多”侧的所有行
只有一种实际的实现选择。没有“决策”。像
主键一样,外键也是一种放置在表中一个或多个列上的约束
外键
在键列和另一个表中的相关列之间建立链接。(您还可以将外键列链接到同一表中的列。)
包含外键的表被视为子表,外键引用的表是父表。
要点
外键
必须引用主键或唯一约束,尽管该引用可以在同一个表上,也可以在不同的表上
外键
的列数也必须与引用约束中的列数相同,并且相应列之间的数据类型必须匹配
与主键
不同,外键
列可以包含NULL值
... 如果没有子/父关系。在联接表中可能是多对多。或者这是一对一的关系,OP应该首先问问自己为什么它被分成两个表。现在,关于self上的双向多对多关系(1链接到2,3,&4,显然是2链接到1,但也可以链接到3,6或其他什么),我没有一个很好的可行的答案。一个伪造的关系id+某种方式在(关系id,主题id)表中仅强制使用该关系id的2行,或者一个2列的表,其自身带有一个连接或联合,以获得“以另一种方式存储”的关系。“做出该决定的系统方式是什么?”“了解关系的性质可能很重要”“对。关系的性质很重要。我不明白这个问题。您想知道如何定义哪个表依赖于另一个表吗?提供了两个父表:customer
、product
和一个子表:product\u order
之间关系的简单示例。在这个例子中,product\u order
是应该包含外键的子表。简言之:这是一个基数问题。如果您有多对一关系,则密钥应位于“多”端。如果是一对一,可能是一对一。如果是多对多,则需要一个中间表。如果是一对一,你可以自由选择。