数据库设计 - 表创建和连接记录

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)

Aki*_*ina 6

这样做的原因是一个用户可以有多个角色吗?

是的,这是正常的。常见的多对多(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_rolesUserRoles不需要桌子。