我想问关于特定问题我有。
例如,我有一个Student
,有一个表SchoolID
和ClassID
,这两者都是外键的School
和Classroom
分别表。 在Class
表中有一个SchoolID
列是一个外键School
表。
有什么办法,我可以保证ClassID
在Student
表是一个孩子SchoolID
,或者我必须删除SchoolID
,只是与生活ClassID
,以防止任何可能的差异?
我想问关于特定问题我有。
例如,我有一个Student
,有一个表SchoolID
和ClassID
,这两者都是外键的School
和Classroom
分别表。 在Class
表中有一个SchoolID
列是一个外键School
表。
有什么办法,我可以保证ClassID
在Student
表是一个孩子SchoolID
,或者我必须删除SchoolID
,只是与生活ClassID
,以防止任何可能的差异?
是的,在技术上你应该删除Student.SchoolId
外键,如果类已经有SchoolId
,因为这已经定义之间的关系, Student
和School
。
这就是说,有一些共同的“例外”这一点,例如:
如果之间的关系, Student
和School
可以意味着什么比之间的关系不同Class
和School
(如果学生上学X为“他/她的主要流派”,但随后又参加一个额外的壁画Y类在学校žEG)。 (实际上,这可能突出一个建模误差,即学生:类实际上可能是一个多对多的关系)
由于性能原因,有时(有点勉强)选择父的外键添加到一个孩子,以避免需要加入回母公司。 但正如你说,这可能会导致完整性问题。
是的,你可以在你的外键参考多个列执行呢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
两个表中的列。
学生表应引用类。
create table Student (
...
SchoolID integer not null,
ClassID integer not null,
foreign key (SchoolID, ClassID) references Class (SchoolID, ClassID),
...
);
反过来,Class表应参考学校。