假设我有一个角色表,例如,
Roles
-----
ID Name
0 Salesman
1 Client
2 Manager
我们还假设这些角色不是相互排斥的:也就是说,一个人可以同时是推销员、客户和经理。
如果我有一个Person
带有Role
字段的表,我如何能够引用Roles
表中的多行?
假设我有一个角色表,例如,
Roles
-----
ID Name
0 Salesman
1 Client
2 Manager
我们还假设这些角色不是相互排斥的:也就是说,一个人可以同时是推销员、客户和经理。
如果我有一个Person
带有Role
字段的表,我如何能够引用Roles
表中的多行?
您引入了一个引用两个原始表的新表:
CREATE TABLE PersonRoles (
PersonID int not null,
RoleID int not null,
constraint PK_PersonRoles PRIMARY KEY (PersonID,RoleID),
constraint FK_PersonRoles_Persons FOREIGN KEY (PersonID) references Person (ID),
constraint FK_PersonRoles_Roles FOREIGN KEY (RoleID) references Role (ID)
)
假设多重性为m:n
,以上是正确的。我做了一个假设(在你的问题中没有列出),一个以上的人可以是例如推销员。
您必须创建另一个具有(至少)两列的表:
PersonId, RoleId
所以你可以插入(例如)
1, 0
1, 2
2, 1
id=1 的人将是销售员和经理,而 id=2 的人将是客户。
为此,您需要建立“nm 关系”。你需要一张额外的桌子,例如。称为“person_role”,其中包含其他两个表的外键:
人物 <===> 人物角色 <===> 角色
所以你将有3张桌子:
Person
------------
ID
Name
etc.
Role
---------
ID
Name
PersonRole
------------
PersonID
RoleID
您还应该将 PersonID 和 RoleID 设置为唯一的复合键,以避免任何重复
/ 卡斯滕