多表间关系

1.目标

  • 能够说出多表之间的关系及其建表原则

2.分析

eg: 下订单(t_order)--->谁下(t_user), 买了什么(t_product)

现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!分成三种:
  1. 一对多
  2. 多对多
  3. 一对一

3.讲解

一对多(1:n)

例如:班级和学生,部门和员工,客户和订单

一的一方: 班级 部门 客户

多的一方:学生 员工 订单

一对多建表原则: 在从表(多方的一方)创建1一个字段,字段作为外键指向主表(一方)的主键

mysql 一对多 聚合 mysql多对多_mysql 一对多 聚合

多对多

多对多(m:n)

例如:老师和学生,学生和课程,用户和角色

一个老师可以有多个学生,一个学生也可以有多个老师 多对多的关系

一个学生可以选多门课程,一门课程也可以由多个学生选择 多对多的关系

一个用户可以有多个角色,一个角色也可以有多个用户 多对多的关系

多对多关系建表原则: 需要创建一张中间表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。

mysql 一对多 聚合 mysql多对多_mysql 一对多 聚合_02

一对一(通常单表)

一对一(1:1): 公司和地址, 老公和老婆

例如: 一个公司只能有一个注册地址,一个注册地址只能对应一个公司。

例如:一个老公可以有一个老婆,一个老婆只能有一个老公

在实际的开发中应用不多.因为一对一可以创建成一张表。

两种建表原则:

  • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一UNIQUE
  • 外键是主键:主表的主键和从表的主键,形成主外键关系

mysql 一对多 聚合 mysql多对多_mysql 一对多 聚合_03

多表设计之多表分析及创建

需求:完成一个学校的选课系统,在选课系统中包含班级,学生和课程这些实体。

分析:

班级和学生: 一对多

学生和课程: 多对多

  1. 班级和学生之间是有关系存在:
    一个班级下包含多个学生,一个学生只能属于某一个班级(一对多的关系)。
  2. 学生和课程之间是有关系存在:
    一个学生可以选择多门课程,一门课程也可以被多个学生所选择(多对多的关系)。

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)
);