关系型数据库三范式的目的是减少容易、让数据库更合理、更灵活。是前人通过实践总结出来的一些规则,数据可将其称之为范式。
关系型数据库三范式分别是指列不可分割、列只能完全依赖主键、列只能直接依赖主键。
第一范式列不可分割是关系型数据库最基本的范式。表中所有字段都是不可分割说明满足第一范式。不过第一范式也是根据业务规则而定。比如人的姓名这个属性,就可以分割为姓和名存储。也可直接存储。这个得看具体业务需求。比如我的业务系统中经常需要用到姓或者名分别作统计和检索什么的,那就应该把姓和名分开存储。才能满足第一范式,并且能提高数据库的性能。
第二范式是指列完全依赖主键,这里是指联合主键的情况下,只是依赖了主键中的一部分,而不是全部。这样就不满足第二范式了。得把只是依赖一部分的字段给重新设计为一张新的表。让现在的表多对一的引用新表。比如:仓库物品关系表,以仓库物品为联合主键的表。
物品 仓库 物品名称 仓库名称 最大库存
1 1 啤酒 酒水库 100
1 2 啤酒 吧台 200
2 2 汽水 酒水库 300
以上表中,仓库名称和物品名称其实都只是依赖主键中的一个,这不满足第二范式,列完全依赖主键。我们可以将物品、和仓库分别拆分为物品信息表和仓库信息表。让仓库物品关系表分别和仓库信息表、物品信息表做多对一的关联。这样就满足了第二范式。
仓库物品关系表
物品 仓库 最大库存
1 1 100
1 2 200
2 2 300
物品信息表
物品 物品名称
1 啤酒
2 汽水
仓库信息表
仓库 仓库名称
1 酒水库
2 吧台
第三范式只能直接依赖主键,而不能间接依赖主键。A→B→C。例如:学生信息表。
学生信息表
主键 学生名称 班级 班级名称
1 张三 1 一年级一班
2 李四 1 一年级一班
3 王五 2 一年级二班
以上信息表中,班级名称就是指依赖班级,班级在依赖主键。实际上班级名称是有班级决定。这就不满足第三范式。这里得班级相关的属性建立一张新表班级表。把班级主键做为学生的外键。就满足第三范式了。
班级信息表
班级 班级名称
1 一年级一班
2 一年级二班
学生信息表
主键 学生名称 班级
1 张三 1
2 李四 1
3 王五 2
这样设计就可以减少学生表的数据冗余。