现实生活中,实体与实体之间肯定是有关系的,比如:老公和老婆,部门和员工,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系!
表关系
本篇主要讲述表的关系还有表的设计相关概述和语句,查询会在其他博客中再进行具体介绍。
表关系根据现实情况可以分为以下三种
- 一对一
- 多对一 一对多 :这里可以理解为两种,但是本质上就是一种
- 多对多
多对一
我们在日常开发和应用中,应用的最多的就是多对一或者一对多关系
一对多(1:n) 例如:班级和学生,部门和员工,客户和订单,分类和商品 一对多建表原则: 在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键,而这里,就是上一篇遗留的一个问题:外键约束
· 外键
当我们遇到这样一种情况,我们在创建一个1000人的大工厂的员工的资料数据库,这些员工大部分分布于深圳和广东的分工厂中工作,我们在记录这些资料的时候,一方面字符串太长而且都是大量重复的信息会增加存储空间的消耗(数据冗余),另一方面,在进行员工调动的时候,我们需要大量的去修改他们的这个工作场地,为了解决这个缺陷,我们可以设计两张表来分别存储信息:
-- 创建部门表
create table dep(
id int primary key auto_increment,
dep_name varchar(20),
dep_location varchar(20)
);
-- 创建员工表
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int
);
-- 插入数据
insert into dep (dep_name, dep_location) values
('研发部', '广州'), ('销售部', '深圳');
insert into emp (name ,age ,dep_id) values
('张三', 20, 1),
('李四', 21, 1),
('王五', 20, 1),
('老王', 20, 2),
('大王', 22, 2),
('小王', 18, 2);
当前信息如上图,我们的目的是在员工表中的dep_id中存储部门表中部门的id,来表示这个员工是哪个部门的。
但是当我们再次添加一个员工的时候,dep_id是可以填为空或者其他数字的,为了避免这种缺陷,我们使用:外键约束
而且这里我们所想描述的关系,就是这个分栏的主题:多对一关系:一个部门对应多个员工
-- 方式1 创建表的时候添加外键,不过这里要在所有字段定义的后面进行添加
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加一个外键
-- 外键取名公司要求,一般fk结尾
constraint emp_depid_ref_dep_id_fk foreign key(dep_id) references dep(id)
);
-- 方式2 修改表的方式进行创建
alter table emp add constraint emp_depid_ref_dep_id_fk foreign key(dep_id) references dep(id);
在Navicat中查看和创建位置:
当进行添加外键后,再进行插入数据,就不能再以其他类型数据储存入被约束表中的关联外键的列中的信息了。
而且外键和关联的外键两者类型必须完全一致包括长度(int型也有长度)
外键约束
一张表中的某个字段引用另一个表的主键
主表: 约束别人 比如这里,就是部门表是主表,用部门来约束员工表
副表/从表: 使用别人的数据,被别人约束 员工表为副表,被部门表约束
外键级联
当我们设置了外键之后,那么就不能直接修改和删除主表中的关联的外键的元素了,因为他都关联着很多其他的元素
什么是级联操作: 在修改和删除主表的主键时,同时更新或删除副表的外键值,称为级联操作 ON UPDATE CASCADE -- 级联更新,主键发生更新时,外键也会更新 ON DELETE CASCADE -- 级联删除,主键发生删除时,外键也会删除
所以当我们想要对外键信息进行修改或者删除的时候我们需要进行定义:
-- 方式1 在创建表的过程中进行定义
create table emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int
-- constraint emp_depid_ref_dep_id_fk foreign key(dep_id) references dep(id) on update cascade on delete cascade
);
-- 方式2 以修改表的方式进行定义
alter table emp add constraint emp_ref_dep foreign key(dep_id) references dep(id) on update cascade on delete cascade;
进行用Navicat定义的时候在箭头指的地方进行选择。
在打开了可以修改和删除的权限时要十分注意,这个操作在开发的时候是十分危险的,当一个外键的选项删除后,相应连接的选项也会全部删除
上述用外键进行表和表之间的约束,就是一对多的关系(一个部门对应许多工人)
多对多
多对多(m:n) 例如:老师和学生,学生和课程,用户和角色 多对多关系建表原则: 需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。
当我们进行创建第三张表的时候,就需要把序号和课程号分别作为外键来链接学生表和课程表中的主键id,来限制他们的数据范围。
并且,我们为了保证学生和课程号关系的唯一性,需要增添其他设置:
①把两个选项都设置主键,这时这个表的主键就是两个列中共同的内容,保证了选课的关系的唯一性
②再添加一个列,设置为主键。
一对一
一对一(1:1) 在实际的开发中应用不多.因为一对一可以创建成一张表。
做成两张表的格式有:
外键唯一:主表的主键和从表的外键(唯一),形成主外键关系:设置一个列来存外键,然后把这个列设置唯一性约束
外键是主键:主表的主键和从表的主键,形成主外键关系