Tra*_*vis 3 mysql database-design
我一直在试图理解设计这个数据库的人的想法。我想知道这个程序叫什么以及为什么它有益。设计这个的人已经去世了,我想知道原因。
假设我有两个表,用户和角色
用户
create table my_users (
userid int,
primary key (userid),
username varchar(255)
);
insert into my_users (userid, username) values (1, 'Stack User 1');
Run Code Online (Sandbox Code Playgroud)
角色
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');
Run Code Online (Sandbox Code Playgroud)
这些表映射在一起称为UserRoles
create table UserRoles (
userroleid int,
primary key (userroleid),
userid int,
roleid int
);
Run Code Online (Sandbox Code Playgroud)
这样做的原因是一个用户可以有多个角色吗?
像这样的东西:
insert into UserRoles (userid, roleid) values (1,1), (1,2), (1,3);
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这样做的原因是一个用户可以有多个角色吗?
是的,这是正常的。常见的多对多(M:N)关系。但是您的结构没有设置任何关系,因为表中没有任何外键。在大多数情况下,值对(userid, roleid)
必须是唯一的。
还有一件事毫无意义——这个东西就是合成主键。在目前的结构中,这是多余的。下面的复合主键结构更加合理:
create table UserRoles (
userid int,
roleid int,
PRIMARY KEY (userid, roleid),
FOREIGN KEY (userid) REFERENCES my_users (userid),
FOREIGN KEY (roleid) REFERENCES my_roles (roleid)
);
Run Code Online (Sandbox Code Playgroud)
当关系本身是一个实体(并且它具有一些附加属性和/或在另一个 M:N 关系中使用)时,合成密钥是合理的。在这种情况下,您可以(userid, roleid)
通过创建唯一索引来提供唯一性:
create table UserRoles (
userroleid int,
primary key (userroleid),
userid int,
roleid int,
UNIQUE (userid, roleid),
FOREIGN KEY (userid) REFERENCES my_users (userid),
FOREIGN KEY (roleid) REFERENCES my_roles (roleid)
);
Run Code Online (Sandbox Code Playgroud)
my_users 中的一列只有一个 roleid 的原因是什么?
如果用户只能拥有一个角色,则该角色是该用户的一种属性,关系将为 1:N,并且相应的关系列将成为my_users
具有 FOREIGN KEY 关系的表的一部分my_roles
。UserRoles
不需要桌子。
归档时间: |
|
查看次数: |
569 次 |
最近记录: |