简介
为了建立冗余较小,结构合理的数据库,设计数据库时必须遵守一定的规则,在关系型数据库中这种规则就是范式。范式是符合某一种级别的关系模式的集合。关系型数据库中的关系必须满足一定的要求,即满足不同的范式。
目前关系型数据库共有六种范式,一般来说数据库只要满足第三范式就可以了,而我们常用的就是我们所说的三大范式,第一范式,第二范式和第三范式。
第一范式
原子性、不可拆分性
什么意思呢?
就是要求你表中的每个字段都是不可继续拆分的,都是最小的数据单元。
如有以下学生信息表
学生信息表
学号 | 姓名 | 家庭地址 | 学院编号 | 学院名称 | 宿舍号 | 宿舍类型 | 宿舍床位数 |
---|---|---|---|---|---|---|---|
001 | 张三 | 陕西省西安市 | 100001 | 理学院 | 222 | 标准间 | 4 |
002 | 李四 | 陕西省咸阳市 | 100002 | 计算机学院 | 333 | 非标准间 | 6 |
003 | 王五 | 陕西省宝鸡市 | 100003 | 马克思主义学院 | 666 | 标准间 | 4 |
其中的地址列可以继续拆分为省、市 所以此表不符合第一范式
第二范式
第二范式 要求在保证第一范式的前提下,要求每一列都要和主键相关,而不能只于主键的一部分有关,要求实体的唯一性。
例如下表:
学号 | 姓名 | 学院编号 | 学院名称 | 宿舍号 | 宿舍类型 | 宿舍床位数 |
---|---|---|---|---|---|---|
001 | 张三 | 100001 | 理学院 | 222 | 标准间 | 4 |
002 | 李四 | 100002 | 计算机学院 | 333 | 非标准间 | 6 |
003 | 王五 | 100003 | 马克思主义学院 | 666 | 标准间 | 4 |
主键为学号和学院编号和宿舍号
姓名、–>学号
学院名称—>学院编号
宿舍类型、宿舍床位数—>宿舍号
以上只是部分依赖 所以违反了第二范式 所以应该将表进行拆分
学号 | 姓名 | 学院编号 | 宿舍号 |
---|---|---|---|
001 | 张三 | 100001 | 222 |
002 | 李四 | 100002 | 333 |
003 | 王五 | 100003 | 666 |
学院编号 | 学院名称 |
---|---|
100001 | 理学院 |
100002 | 计算机学院 |
100003 | 马克思主义学院 |
宿舍号 | 宿舍类型 | 宿舍床位数 |
---|---|---|
222 | 标准间 | 4 |
333 | 非标准间 | 6 |
666 | 标准间 | 4 |
第一张表的主键为学号,第二张表的主键为学院编号,第三章表的主键为宿舍号
这样设计使得数据库更加清晰,如需要查找学院的名称,直接在学院表查询
第三范式
第三范式要求每列都和主键列直接相关而不是间接相关,即限制列的冗余性
。
宿舍号 | 宿舍类型 | 宿舍床位数 |
---|---|---|
222 | 标准间 | 4 |
333 | 非标准间 | 6 |
666 | 标准间 | 4 |
比如上表。宿舍号—>宿舍类型—>宿舍床位数
从这些依赖中我们可以由宿舍号—>宿舍床位数
由宿舍号—>宿舍床位数称之为传递依赖
所以应该将表再次细分
宿舍号 | 宿舍类型 |
---|---|
222 | 标准间 |
333 | 非标准间 |
666 | 标准间 |
宿舍类型 | 宿舍床位数 |
---|---|
标准间 | 4 |
非标准间 | 6 |
标准间 | 4 |
这样就不存在间接依赖。
注意:主键与外键在多表中的重复出现不属于数据冗余,非键字段的重复出现才是数据冗余。