数据库设计和软件设计一样,都需要遵守一定的规范,这样才能有效去除冗余信息并设计出结构清晰,关系合理的数据库,同时还能防止发生插入,删除和更新(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进行处理,非常感谢!