Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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
Database 确定具有一对一关系的表之间的FK_Database_Database Design_Foreign Keys_Primary Key_One To One - Fatal编程技术网

Database 确定具有一对一关系的表之间的FK

Database 确定具有一对一关系的表之间的FK,database,database-design,foreign-keys,primary-key,one-to-one,Database,Database Design,Foreign Keys,Primary Key,One To One,我是DB design的新手,很抱歉这个noob问题。我有两个简单的表,它们之间有1对1的关系。哪个表的PK应该是其他表中的FK?我如何才能确定这一点?为了确定这一点,要问的问题是关系是否为真的1::1 如果关系是a1::0..1(即B中的每一行在a中都有一个相关行,但a中的行可能(全部)在B中没有一行),那么表B(pk)中应该有一个外键引用a(pk)。这是最常见的情况,几乎在所有DBMS中都很容易实现 如果关系是真的1::1(即表a中的每一行在表B中都有一个相关行,反之亦然),那么应该有两个外

我是DB design的新手,很抱歉这个noob问题。我有两个简单的表,它们之间有1对1的关系。哪个表的PK应该是其他表中的FK?我如何才能确定这一点?

为了确定这一点,要问的问题是关系是否为真的
1::1

如果关系是a
1::0..1
(即B中的每一行在a中都有一个相关行,但a中的行可能(全部)在B中没有一行),那么表
B(pk)
中应该有一个
外键
引用a(pk)
。这是最常见的情况,几乎在所有DBMS中都很容易实现

如果关系是真的
1::1
(即表a中的每一行在表B中都有一个相关行,反之亦然),那么应该有两个外键,一个从B到a,另一个从a到B。这也很容易声明,但要真正使它工作起来并不是那么简单

问题源于鸡和蛋的问题:我应该首先在哪个表中插入一行?如果我们先插入A,外键(指向B)将禁止插入。如果我们先插入B,外键(指向A)将禁止这次插入


为了实现这一点,两条insert语句必须在一个事务中,并且外键必须定义为可延迟的,即在事务结束时检查。因此,如果您在SQL Server(或MySQL)中工作,您就无法做到这一点。如果您在Postgres、Oracle或任何其他实现了可延迟约束的DBMS中,这是可以实现的

为了确定这一点,要问的问题是关系是否为真
1::1

如果关系是a
1::0..1
(即B中的每一行在a中都有一个相关行,但a中的行可能(全部)在B中没有一行),那么表
B(pk)
中应该有一个
外键
引用a(pk)
。这是最常见的情况,几乎在所有DBMS中都很容易实现

如果关系是真的
1::1
(即表a中的每一行在表B中都有一个相关行,反之亦然),那么应该有两个外键,一个从B到a,另一个从a到B。这也很容易声明,但要真正使它工作起来并不是那么简单

问题源于鸡和蛋的问题:我应该首先在哪个表中插入一行?如果我们先插入A,外键(指向B)将禁止插入。如果我们先插入B,外键(指向A)将禁止这次插入


为了实现这一点,两条insert语句必须在一个事务中,并且外键必须定义为可延迟的,即在事务结束时检查。因此,如果您在SQL Server(或MySQL)中工作,您就无法做到这一点。如果您在Postgres、Oracle或任何其他实现了可延迟约束的DBMS中,这是可以实现的

为了确定这一点,要问的问题是关系是否为真
1::1

如果关系是a
1::0..1
(即B中的每一行在a中都有一个相关行,但a中的行可能(全部)在B中没有一行),那么表
B(pk)
中应该有一个
外键
引用a(pk)
。这是最常见的情况,几乎在所有DBMS中都很容易实现

如果关系是真的
1::1
(即表a中的每一行在表B中都有一个相关行,反之亦然),那么应该有两个外键,一个从B到a,另一个从a到B。这也很容易声明,但要真正使它工作起来并不是那么简单

问题源于鸡和蛋的问题:我应该首先在哪个表中插入一行?如果我们先插入A,外键(指向B)将禁止插入。如果我们先插入B,外键(指向A)将禁止这次插入


为了实现这一点,两条insert语句必须在一个事务中,并且外键必须定义为可延迟的,即在事务结束时检查。因此,如果您在SQL Server(或MySQL)中工作,您就无法做到这一点。如果您在Postgres、Oracle或任何其他实现了可延迟约束的DBMS中,这是可以实现的

为了确定这一点,要问的问题是关系是否为真
1::1

如果关系是a
1::0..1
(即B中的每一行在a中都有一个相关行,但a中的行可能(全部)在B中没有一行),那么表
B(pk)
中应该有一个
外键
引用a(pk)
。这是最常见的情况,几乎在所有DBMS中都很容易实现

如果关系是真的
1::1
(即表a中的每一行在表B中都有一个相关行,反之亦然),那么应该有两个外键,一个从B到a,另一个从a到B。这也很容易声明,但要真正使它工作起来并不是那么简单

问题源于鸡和蛋的问题:我应该首先在哪个表中插入一行?如果我们先插入A,外键(指向B)将禁止插入。如果我们先插入B,外键(指向A)将禁止这次插入

为了实现这一点,两条insert语句必须在一个事务中,并且外键必须定义为可延迟的,即在事务结束时检查。因此,如果您在SQL Server(或MySQL)中工作,您就无法做到这一点。如果您在Postgres或Oracle或任何其他具有implem的DBMS中
CREATE TABLE ONE (
    ID INT PRIMARY KEY
);

CREATE TABLE ZERO_OR_ONE (
    ID INT PRIMARY KEY REFERENCES ONE (ID)
);