多表设计
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
- 一对多(多对一)
- 多对多
- 一对一
一对多
1.表设计
创建新的数据库,将多表设计存在新数据库下。在创建新的部门表单,员工和部门之间是一对多的关系。
-- 部门表
create table tb_dept
(
id int unsigned primary key auto_increment comment '主键ID',
name varchar(10) not null unique comment '部门名称',
create_time datetime not null comment '创建时间',
update_time datetime not null comment '修改时间'
) comment '部门表';
员工表 - 部门表之间的关系:
一对多关系实现:在数据库表中多的一方,添加字段,来关联属于一这方的主键。
2.外键约束
表结构创建完毕后,我们看到两张表的数据分别为:
现在员工表中有五个员工都归属于1号部门(学工部),当删除了1号部门后,数据变为:
1号部门被删除了,但是依然还有5个员工是属于1号部门的。 此时:就出现数据的不完整、不一致了。
所以目前上述的两张表(员工表、部门表),在数据库层面,并未建立关联,所以是无法保证数据的一致性和完整性的。
想解决上述的问题呢,我们就可以通过数据库中的 **外键约束** 来解决。
外键约束:让两张表的数据建立连接,保证数据的一致性和完整性。 对应的关键字:foreign key
外键约束的语法:
方式一:创建表时指定
create table 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key (外键字段名) references 主表 (主表列名)
);
方式二:建完表后,添加外键
alter table 表名 add constraint 外键名称 foreign key(外键字段名)
references 主表(主表列名);
我们就为员工表的dept_id 建立外键约束,来关联部门表的主键。
```mysql
-- 修改表: 添加外键约束
alter table tb_emp
add constraint fk_dept_id foreign key (dept_id) references tb_dept(id);
```
图形化界面操作:
外键约束(foreign key):保证了数据的完整性和一致性。
物理外键和逻辑外键:
物理外键
- 概念:使用foreign key定义外键关联另外一张表。
- 缺点:
- 影响增、删、改的效率(需要检查外键关系)。
- 仅用于单节点数据库,不适用与分布式、集群场景。
- 容易引发数据库的死锁问题,消耗性能。
逻辑外键
- 概念:在业务层逻辑中,解决外键关联。
- 通过逻辑外键,就可以很方便的解决上述问题。
在现在的企业开发中,很少会使用物理外键,都是使用逻辑外键。 甚至在一些数据库开发规范中,会明确指出禁止使用物理外键 foreign key 。