每個表人員和團隊代表實體。交叉表或交叉表每個表示實體之間的關係。如果你有多個可能的關係,那麼有多個聯結表是有意義的。
您提示某些關係可能是相互排斥的。這是一個足夠簡單的問題來解決。
create table CaptainOrMember(
PersonID int not null,
TeamID int not null,
C_or_M char(1) not null,
constraint PK_CaptainOrMember primary key(PersonID, TeamID),
constraint FK_CaptainOrMember_Person foreign key(PersonID)
references People(ID),
constraint FK_CaptainOrMember_Team foreign key(TeamID)
references Team(ID),
constraint CK_CaptainOrMember_OneOrOther check(C_or_M in('C', 'M')
);
這定義了船長和成員關係。只有一個人< - >可以進入隊伍,並且必須用'C'或'M'指定。所以一個人可以成爲一名隊長或一名隊員,但不能同時兼任。
它具有爲兩個關係使用一個聯結表的附加優勢。
也就是說,除非您有一些Captain-only和僅限會員的數據要添加到關係元組中。然後你可以添加兩個「子結」表。這裏他們是爲了說明。
alter table CaptainOrMember add constraint UQ_CaptainOrMember_OneOrOther unique(PersonID, TeamID, C_or_M);
create table Captains(
PersonID int not null,
TeamID int not null,
C_or_M char(1) not null,
...,
..., <Captain related data>
...,
constraint PK_Captains primary key(PersonID, TeamID),
constraint CK_Captains_OneOrOther check(C_or_M = 'C'),
constraint FK_Captains_Captain foreign key(PersonID, TeamID, C_or_M)
references CaptainOrMember(PersonID, TeamID, C_or_M)
);
create table Members(
PersonID int not null,
TeamID int not null,
C_or_M char(1) not null,
...,
..., <Member related data>
...,
constraint PK_Members primary key(PersonID, TeamID),
constraint CK_Members_OneOrOther check(C_or_M = 'M'),
constraint FK_Members_Member foreign key(PersonID, TeamID, C_or_M)
references CaptainOrMember(PersonID, TeamID, C_or_M)
);
如果表CaptainOrMember的條目定義一個特定的人作爲一個特殊團隊的隊長,那麼該組合那個人和團隊不能插入成員表。它只能存在於船長表中。反之亦然。