Mysql 表设计【总结】

一、表设计之关联关系:

1、一对一:数据一部分频繁被访问,一些不怎么被访问,则这样可以创建两张表。

  • 什么是一对一:有AB两张表,其中A表的一条数据对应B表的一条数据,同时B表的一条数据也对应A表的一条数据。
  • 应用场景:用户表和用户信息扩展表;商品表和商品信息扩展表;

外键:表中用于建立关系的字段称为外键,一张表可能有多个外键,但只会有一个主键。

  • 如果建立关系:从表中添加外键指向主表的主键。

例:创建user和userinfo表:假如用户包含用户名、密码、昵称、年龄、地址、性别字段。我们就可以将常用的用户名和密码存储到user表,并未其添加主键id,同时创建从表userinfo,存储其他昵称、年龄等信息,并添加外键userid对应主表的主键id,这样就保证了一对一的关系,在我们需要查询某用户的userinfo时可以用id对应从表外键userid进行匹配查询即可。

2、一对多:有AB两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的一条数据。

  • 应用场景:用户表和部门表;商品表和分类表(一个分类里包含很多商品,但是一种商品只能属于一个分类)。
  • 建立关系:在多个一段添加外键,指向另外一张表的主键。

例:创建emp表和dept表:比如我们创建的dept部门表并添加主键id,中有两个部门一个技术部id = 1、一个设计部对应id=2,此时我们再创建一个emp表,并为其添加外键deptid = 1对应主表dept的主键id,例如我们添加小张 deptid = 1,小李deptid = 1,小王deptid = 2,小赵deptid = 2这是我们通过dept表中的主键id 为 1去从表emp中对应的deptid相匹配的1去查找,可以找出小张和小李两个人,这就实现了一对多,一个主表dept对应了从表emp中的多条数据。

3、多对多:有AB两张表,A表中的一条数据对应B表中的多条数据,同时B表中的一条数据对应A表中的多条数据。

  • 应用场景:老师表和学生表;用户表和角色表;角色表和权限表;
  • 建立关系:通过第三张关系表保存两张主表的关系;第三张关系表里记录的是两个主表的主键;

例:创建老师表,学生表和关系表:

create table teacher(id int primary key auto_increment,name varchar(10));
create table student(id int primary key auto_increment,name varchar(10));
create table t_s(tid int,sid int);

查询每个学生姓名和对应的老师姓名:

select s.name,t.name from t_s ts join teacher t on ts.tid = t.id join student s on ts.sid = s.id;

查询李老师的学生都有谁:

select s.name,t.name from t_s ts join teacher t on ts.tid = t.id join student s on ts.sid = s.id where t.name = '李老师';

查询小丽的老师都有谁:

select s.name,t.name from t_s ts join teacher t on ts.tid = t.id join student s on ts.sid = s.id where s.name = '小丽';

4、自关联:当前表中添加外键,外键的值指向当前表的主键,这种关联方式称为自关联;

  • 应用场景:在用户表中,有的用户有上级领导,有的没有,此时可以添加一个外键指向上级领导的主键id。

例:创建person表,主键id,name,mgr领导指向主键id

create table person(id int primary key auto_increment,name varchar(10),mgr int);

保存以下数据:效果如下:

insert into person values(null,'如来',null),(null,'唐僧',1),(null,'悟空',2),(null,'猴孙',3);

在这里插入图片描述
查询每个人的名字和上级的名字:

select p.name,p2.name as 上级	 from person p left join person p2 on p.mgr = p2.id; 

在这里插入图片描述
5、表设计案例:权限管理

  • 实现方式:实现权限管理功能需要准备三张主表和两张关系表;
  • 应用场景:
    • 主表:一张用户表、一张角色表、一张角色权限表
    • 关系表:用户和角色对应关系,角色和角色权限对应关系

练习:创建表:

create table user(id int primary key auto_increment,name varchar(10));
create table role(id int primary key auto_increment,name varchar(10));
create table module(id int primary key auto_increment,name varchar(10));
create table u_r(uid int,rid int);
create table r_m(rid int,mid int);

插入数据:

insert into user values(1,'刘德华'),(2,'凤姐');
insert into role values(1,'男游客'),(2,'男会员'),(3,'女游客'),(4,'女管理员'); 
insert into module values(1,'男浏览'),(2,'男发帖'),(3,'女浏览'),(4,'女发帖'),(5,'女删帖');

保存用户和角色的关系 刘德华:男会员和女游客 凤姐:女管理员和男游客:

insert into u_r values(1,2),(1,3),(2,1),(2,4);

保存角色和权限:

insert into r_m values(1,1),(2,1),(2,2),(3,3),(4,3),(4,4),(4,5);

查询每个用户权限有哪些:

select u.name 名字,m.name 权限 from user u join u_r on u.id = ur.id join r_m rm on ur.rid = rm.rid join module m on rm.mid = m.id;

查询凤姐的权限:

select u.name 名字,m.name 权限 from user u join u_r ur on u.id=ur.uid join r_m rm on rm.rid=ur.rid join module m on rm.mid=m.id where u.name='凤姐';

查询拥有男预览权限的用户有谁:

select m.name 权限,u.name 预览 from user u join u_r ur on u.id=ur.uid join r_m rm on ur.rid=rm.rid join module m on m.id=rm.mid where m.name in('男浏览','女浏览');

猜你喜欢

转载自blog.csdn.net/weixin_44296929/article/details/108659615