Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我应该在哪里存储外键?_Mysql_Database_Database Design_Data Modeling - Fatal编程技术网

Mysql 我应该在哪里存储外键?

Mysql 我应该在哪里存储外键?,mysql,database,database-design,data-modeling,Mysql,Database,Database Design,Data Modeling,如果我在两个表之间有关系(两个表都有自己的主键),那么在决定哪个表应该存储外键时,应该以什么为指导?我知道关系的性质可能很重要(一对一、一对多、多对多、单向、双向),访问模式也可能很重要。但是,做出这种决定的系统方法是什么?哪张表是关系中的子表? 回答这个问题,您就知道哪个表需要外键列,引用父表的[通常]主键。这是一对多的关系 多对多需要添加第三个表,使用两个表中的键作为主键。外键只是一个表中引用另一个表的键字段的字段。识别外键字段本身并不是绝对重要的。也就是说,您不需要显式地添加外键。。。引用

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

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


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

外键只是一个表中引用另一个表的键字段的字段。识别外键字段本身并不是绝对重要的。也就是说,您不需要显式地添加外键。。。引用表的约束,使其成为外键。将两个表联接在一起时,父表的主键将设置为等于子表的外键。无论哪个不是主键,都是外键

在一对多关系中,FK站在“多”一边。它不能放在“一”端,因为PK就放在这一边,主键的定义包括禁止重复

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


“但是,做出这一决定的系统方法是什么?”

似乎有两种选择:“一”侧作为FK的“多”侧,或“多”侧具有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
    是应该包含外键的子表。简言之:这是一个基数问题。如果您有多对一关系,则密钥应位于“多”端。如果是一对一,可能是一对一。如果是多对多,则需要一个中间表。如果是一对一,你可以自由选择。