数据库的三大范式
第一范式(1NF)
原子性:保证每一列不可再分
举例:
在上面的表中,family_inf列中不满足原子性的要求,故不满足第一范式。需调整如下:
第二范式(2NF)
在第一范式的基础下,非主键属性必须完全依赖于主键(候选码)
举例:
在上面的表中,同一订单中可能包含不同的商品(如订单2、订单3),因此主键必须由“订单编号”和“商品号”联合组成。“商品名称”、“商品数量”、“商品折扣”和“价格”都是依赖于“订单编号”和“商品号”;“订单金额”只依赖于“订单编号”(没有完全依赖于主键)。
不满足第二范式,调整如下,需要分成两个表:
第三范式(3NF)
在第一范式、第二范式的基础下,第三范式需要确保数据表中每一列数据都与主键直接相关,而不能间接相关(消除传递依赖)。
举例:
在上面的表中,所有的属性都不可再分且都完全依赖于编号,所以符合第一、第二范式。但是,“老师性别”和“老师年龄”直接依赖的是“老师姓名”,而不是主键“编号”,所以需调整为以下两个表:
学生表老师表
这样就满足了第三范式的要求。
ps:上表中的老师姓名改成老师ID更确切,更符合我们实际开发的情况。
规范性和性能的问题
关联查询的表不得超过三张
- 考虑商业化的需求和目标(成本、用户体验)数据库的性能更加重要
- 在规范和性能的问题的时候,需要适当考虑规范性
- 故意给一些表增加一些冗余的字段。(从多表查询变为单表查询)