SQL:外键是另一个外键的孩子(SQL: Foreign key that is a child o

2019-10-17 04:25发布

我想问关于特定问题我有。

例如,我有一个Student ,有一个表SchoolIDClassID ,这两者都是外键的SchoolClassroom分别表。 在Class表中有一个SchoolID列是一个外键School表。

有什么办法,我可以保证ClassIDStudent表是一个孩子SchoolID ,或者我必须删除SchoolID ,只是与生活ClassID ,以防止任何可能的差异?

Answer 1:

是的,在技术上你应该删除Student.SchoolId外键,如果类已经有SchoolId ,因为这已经定义之间的关系, StudentSchool

这就是说,有一些共同的“例外”这一点,例如:

  1. 如果之间的关系, StudentSchool可以意味着什么比之间的关系不同ClassSchool (如果学生上学X为“他/她的主要流派”,但随后又参加一个额外的壁画Y类在学校žEG)。 (实际上,这可能突出一个建模误差,即学生:类实际上可能是一个多对多的关系)

  2. 由于性能原因,有时(有点勉强)选择父的外键添加到一个孩子,以避免需要加入回母公司。 但正如你说,这可能会导致完整性问题。



Answer 2:

是的,你可以在你的外键参考多个列执行呢Classes表:

create table Schools (
    SchoolID int not null primary key,
    Name varchar(30) not null unique
)
go
create table Classes (
    ClassID int not null primary key,
    SchoolID int not null foreign key references Schools (SchoolID),
    Name varchar(30) not null,
    constraint UQ_Class_Schools UNIQUE (ClassID,SchoolID),
    constraint UQ_Class_Names UNIQUE (SchoolID,Name)
)
go
create table Students (
    StudentID int not null primary key,
    SchoolID int not null foreign key references Schools (SchoolID),
    ClassID int not null,
    Name varchar(95) not null,
    constraint FK_Student_Classes FOREIGN KEY (ClassID,SchoolID) references Classes (ClassID,SchoolID)
)

根据口味,你可以决定也申报的外键ClassID两个表中的列。



Answer 3:

学生表应引用类。

create table Student (
  ...
  SchoolID integer not null,
  ClassID integer not null,
  foreign key (SchoolID, ClassID) references Class (SchoolID, ClassID),
  ...
);

反过来,Class表应参考学校。



文章来源: SQL: Foreign key that is a child of another foreign key