数据库设计之三大范式

数据库设计和软件设计一样,都需要遵守一定的规范,这样才能有效去除冗余信息并设计出结构清晰,关系合理的数据库,同时还能防止发生插入,删除和更新(INSERT, DELETE, UPDATE)操作异常。作为一个专业的程序猿,必须要牢牢掌握数据库设计的三大范式。

三大范式

第一范式(1NF)

数据表中的每一个字段都必须是不可拆分的最小单元,确保每一个字段的原子性。

比如下面的表格:

姓名 年龄 地址
z00001 张三 25 广东省佛山市大沥镇永平村三组4
l00002 李四 33 陕西省西安市南二环中段长安大学
w00003 王麻子 34 四川省成都市武侯区浆洗街6

上面表格不满足1NF,因为其地址字段还能拆分为省,市,区,街道,所以满足1NF的表格应该为:

姓名 年龄 街道
z00001 张三 25 广东省 佛山市 海珠区 大沥镇永平村三组4
l00002 李四 33 陕西省 西安市 新城区 南二环中段长安大学
w00003 王麻子 34 四川省 成都市 武侯区 浆洗街6

这样做的好处是方便筛选,查询以及后续扩展。

第二范式(2NF)

首先必须满足1NF,然后表中的所有字段,都必须完全依赖于主键,而不能有任何一列与主键没有关系,确保一张表只描述一件事情。

举例说明:

姓名 年龄 客户编 客户名称
z00001 张三 25 C0001 华为
l00002 李四 33 C0002 腾讯
w00003 王麻子 34 C0003 阿里巴巴

上面表格满足1NF但是不满足2NF,因为客户编 和客户名称并不依赖于工 这个主键,所以表格需要分别拆分为

员工表:

姓名 年龄
z00001 张三 25
l00002 李四 33
w00003 王麻子 34

客户表:

客户编 客户名称
C0001 华为
C0002 腾讯
C0003 阿里巴巴

拆分后保证了每一张表至描述了一件事情,表格结构更加清晰。

第三范式(3NF)

在满足2NF的基础上,表中的每一个字段只与主键直接相关而不是间接相关,即表中的每一个字段只能直接依赖于主键。

举例说明:

姓名 年龄 部门电话 所在部门
z00001 张三 25 010-2123123 人事部
l00002 李四 33 010-2009889 公共关系部
w00003 王麻子 34 010-2009889 公共关系部

上面表格满足2NF但是不满足3NF,因为存在 “部门电话” 依赖于 “所在部门”, 而 “所在部门” 依赖于 “工 ” 这种传递依赖关系, “部门电话” 字段并不直接依赖于工 这个主键,所以需要把这张表拆分成两张表,并用外键(部门编 )来描述这种多对一的关系,分别拆分为

员工表:

姓名 年龄 所在部门
z00001 张三 25 B01
l00002 李四 33 B02
w00003 王麻子 34 B02

部门表:

部门编 部门名称 部门电话
B01 人事部 010-2123123
B02 公共关系部 010-2009889

拆分后有效的消除了冗余的部门信息,表格结构更加清晰。

总结

第一范式:表中的每一个字段能不能再细分。(字段原子性)
第二范式:表能不能拆分成互相独立的多个表。(每个表至描述一种东西)
第三范式:已经分成的多个表如果有关联,那么在一张表中只能存在另外一张关联表的主键。(通过外键来查询信息)

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树设计优化反范式设计31260 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2018年2月16日
下一篇 2018年2月16日

相关推荐