这是正确的外键关系标准吗?

问题描述 投票:0回答:1

假设我有 3 张桌子,并从父母到孩子排序:

  • Table A
    (专栏
    AId
  • Table B
    (列
    BId
    AId
  • Table C
    (列
    CId
    AId
    BId

Table B.AId
正在引用
Table A.AId

Table C.BId
链接到
Table B.BId
并且
Table C.AId
链接到
Table B.AId
- 而不是
Table A.AId

我可以知道这是否是正确的标准吗?解释更多信息。

sql database entity-framework entity entity-relationship
1个回答
0
投票

答案可能取决于您实际使用的数据库。

我使用 Oracle,从它的角度来看,你的方法行不通,因为外键 必须引用另一个表中的主(或唯一)键。

这意味着前两个表可以毫无问题地创建:

SQL> create table table_a
  2    (aid number primary key);

Table created.

SQL> create table table_b
  2    (bid number primary key,
  3     aid number references table_a (aid));

Table created.

但是,

table_c
会失败,因为
aid
试图引用
table_b.aid
,但该列不是
table_b
中的主键:

SQL> create table table_c
  2    (cid number primary key,
  3     bid number references table_b (bid),
  4     aid number references table_b (aid));
   aid number references table_b (aid))
                                  *
ERROR at line 4:
ORA-02270: no matching unique or primary key for this column-list

但是,如果

table_c.aid
引用
table_a.aid
(主键列),则一切正常:

SQL> create table table_c
  2    (cid number primary key,
  3     bid number references table_b (bid),
  4     aid number references table_a (aid));

Table created.

替代方法(尽管这不是您所描述的)是复合主键(然后是外键):

SQL> drop table table_c;

Table dropped.

SQL> drop table table_b;

Table dropped.

复合主键:

SQL> create table table_b
  2    (bid number,
  3     aid number references table_a (aid),
  4     --
  5     constraint pk_b primary key (bid, aid));

Table created.

table_c
仍然无法引用
table_b
的专栏单独:

SQL> create table table_c
  2    (cid number primary key,
  3     bid number references table_b (bid),
  4     aid number references table_b (aid));
   bid number references table_b (bid),
                                  *
ERROR at line 3:
ORA-02270: no matching unique or primary key for this column-list

复合外键就可以了:

SQL> create table table_c
  2    (cid number primary key,
  3     bid number,
  4     aid number,
  5     --
  6     constraint fk_cb foreign key (bid, aid) references table_b (bid, aid));

Table created.

SQL>

如果您的数据库支持引用any列的外键(不必是主键/唯一键),您可能能够创建这样的数据模型。这是对的吗?不知道,你应该知道为什么要以这种方式引用列。如果是我,我会参考

table_a.aid
中的
table_c.aid

© www.soinside.com 2019 - 2024. All rights reserved.