我一直试图了解设计这个数据库的人的想法。我想知道这个程序叫什么以及为什么它是有益的。设计这个的人走了,我想知道为什么。
假设我有两个表,用户和角色
用户
create table my_users (
userid int,
primary key (userid),
username varchar(255)
);
insert into my_users (userid, username) values (1, 'Stack User 1');
角色
create table my_roles (
roleid int,
primary key (roleid),
rolename varchar(255)
);
insert into my_roles (roleid, rolename) values (1, 'Admin'), (2, 'Local User'), (3, 'DB Owner');
这些表被映射在一起,称为UserRoles
create table UserRoles (
userroleid int,
primary key (userroleid),
userid int,
roleid int
);
这样做的原因是因为一个用户可以有多个角色吗?
像这样的东西:
insert into UserRoles (userid, roleid) values (1,1), (1,2), (1,3);
my_users 中只有一个roleid 的列的原因是什么?
create table my_users_2 (
userid int,
primary key (userid),
username varchar(255),
roleid int
);
insert into my_users_2 (userid, username, roleid) values (1, 'Stack Exchange', 1);
是的,这很正常。常见的多对多 (M:N) 关系。但是您的结构没有设置任何关系,因为表中没有任何 FOREIGN KEY。在大多数情况下
(userid, roleid)
,此类表中的值对必须是唯一的。还有一件事毫无意义——这件事是合成主键。在目前的结构中,它是多余的。具有复合主键的下一个结构更合理:
当关系本身是一个实体(并且它具有一些附加属性和/或用于另一个 M:N 关系)时,合成键是合理的。在这种情况下,您将
(userid, roleid)
通过创建相应的唯一索引来提供唯一性:如果用户只能拥有一个角色,则角色是用户的一个属性,关系将是 1:N,并且相应的关系列将是
my_users
与 FOREIGN KEY 关系的表的一部分my_roles
。该表UserRoles
不需要。(增加Akina的回答)
对于 1:many(1 个角色有多个用户;每个用户最多可以有 1 个角色),添加
roleid
到myusers
.对于 many:many(每个用户可能有多个角色,每个角色有多个用户) ,这比 Akina 的建议更有效:
不需要额外的列
userroleid
。