范式:
简单的说就是要遵循的规则,设计表的时候所依据的规范
第一范式
要求有主键,并且每个字段不可分割,只具有单一属性
(原子性)
单一属性的列有基本数据类型所构成的,设计出来的表都是简单的二维表
人话就是说 一个对象不可以有多种含义 / 一个实体的属性不能有重复或者有多个值
第二范式
在第一范式基础上
所有非主键字段完全依赖主键,不能产生部分依赖
人话就是说 不能只依赖主键的一部分 / 一张表只描述一件事情 / 尽量不要使用复合主键
如果只有一个主键,肯定符合第二范式了
如果表不符合第二范式,一般要拆分成三个表以上来修改
第三范式
在第二范式基础上
所有非主键字段和主键字段之间不能产生传递依赖
人话就是说 列数据都和主键直接相关,而不能间接相关,也就是说非主键字段不能依赖非主键字段
什么是传递依赖:
在关系模式R(U)中,设X,Y,Z是U的不同的属性子集,
如果X确定Y、Y确定Z,且有X不包含Y,Y不确定X,(X∪Y)∩Z=空集合
则称Z传递函数依赖(transitive functional dependency) 于X。
传递函数依赖会导致数据冗余和异常。
传递函数依赖的Y和Z子集往往同属于某一个事物,因此可将其合并放到一个表中。
学号 宿舍 费用
062201 A 900
062230 B 1200
062240 B 1200
学号确定宿舍、宿舍确定费用,且有学号不包含宿舍,宿舍不确定学号,符合传递函数依赖条件。
所以以上关系R存在
添加异常(建了C宿舍但是没人住无法添加了)
删除异常(学生062201退学了宿舍A也删除掉)
如果存在传递函数依赖,如下更改
学号 宿舍
062201 A
062230 B
062240 B
宿舍 费用
A 900
B 1200
经典设计
一对一:
第一种方案:
共享主键
t_husband表:
hno(pk) | hname |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
t_wife表:
wno(pk,fk) | hname |
---|---|
1 | 张女士 |
2 | 李女士 |
3 | 王女士 |
fk,引用的是t_husband的主键
第二种方案:
t_husband表:
hno(pk) | hname | uwon(fk) |
---|---|---|
1 | 张三 | 100 |
2 | 李四 | 200 |
3 | 王五 | 300 |
t_wife表:
wno(pk) | hname |
---|---|
100 | 张女士 |
200 | 李女士 |
300 | 王女士 |
一对多:
多对多
分三张表存储,有一个是中间关联表