多表间关系
1.目标
- 能够说出多表之间的关系及其建表原则
2.分析
eg: 下订单(t_order)--->谁下(t_user), 买了什么(t_product)
现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!分成三种:
- 一对多
- 多对多
- 一对一
3.讲解
一对多(1:n)
例如:班级和学生,部门和员工,客户和订单
一的一方: 班级 部门 客户
多的一方:学生 员工 订单
一对多建表原则: 在从表(多方的一方)创建1一个字段,字段作为外键指向主表(一方)的主键
多对多
多对多(m:n)
例如:老师和学生,学生和课程,用户和角色
一个老师可以有多个学生,一个学生也可以有多个老师 多对多的关系
一个学生可以选多门课程,一门课程也可以由多个学生选择 多对多的关系
一个用户可以有多个角色,一个角色也可以有多个用户 多对多的关系
多对多关系建表原则: 需要创建一张中间表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
一对一(通常单表)
一对一(1:1): 公司和地址, 老公和老婆
例如: 一个公司只能有一个注册地址,一个注册地址只能对应一个公司。
例如:一个老公可以有一个老婆,一个老婆只能有一个老公
在实际的开发中应用不多.因为一对一可以创建成一张表。
两种建表原则:
- 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一UNIQUE
- 外键是主键:主表的主键和从表的主键,形成主外键关系
多表设计之多表分析及创建
需求:完成一个学校的选课系统,在选课系统中包含班级,学生和课程这些实体。
分析:
班级和学生: 一对多
学生和课程: 多对多
- 班级和学生之间是有关系存在:
一个班级下包含多个学生,一个学生只能属于某一个班级(一对多的关系)。 - 学生和课程之间是有关系存在:
一个学生可以选择多门课程,一门课程也可以被多个学生所选择(多对多的关系)。
MySql代码
-- 多表建表原则练习
-- 班级和学生: 一对多
-- 学生和课程: 多对多
-- 创建班级表
create table class(
cid int primary key auto_increment,
cname varchar(40)
);
-- 创建学生表
create table student(
sid int primary key auto_increment,
sname varchar(40),
c_id int,
constraint stu_cls_fk1 foreign key(c_id) references class(cid)
);
-- 创建课程表
create table course(
co_id int primary key auto_increment,
co_name varchar(40)
);
-- 创建中间表
create table stu_co(
sno int,
cno int,
constraint stu_co_fk1 foreign key(sno) references student(sid),
constraint stu_co_fk2 foreign key(cno) references course(co_id)
);