本文借用该文中的例子阐述自己对三大范式的理解
第一范式(1NF):列不可再分
第一范式要求数据库表的每一列都是不可分割的原子数据项。
例如:
上表中的“家庭信息”和“学校信息”列中的信息还能继续划分,因此均不满足原子性的要求。
故调整如下:
上表中的每一列,均不可再分,因此满足第一范式。
第二范式(2NF):各属性完全依赖于主键
在满足第一范式的前提下,每一列都需要与主键相关。
例如:
上表中的主键为:[订单号,产品号]。
若要满足第二范式,除主键外的其他列,都需与主键[订单号,产品号]相关。而“订单金额”和“订单时间”两列信息只与“订单号”相关,而与“产品号”无关。因此不满足2NF。
故调整如下:
将“订单金额”和“订单时间”两列信息与“订单号”自成一表,剩余信息为一表,从而满足各属性完全依赖于主键。
第三范式(3NF):属性直接依赖于主键,而不依赖于其它非主属性
在满足第二范式的前提下,各列与主键直接相关,除主键外的其他各列之间不能有联系。
例如:
上表中的主键为:[学号]。所有属性都依赖于“学号”,满足2NF。
但是,表中“班主任性别”和“班主任年龄”又依赖于“班主任姓名”,因此不满足 3NF。
故调整如下:
调整后的上表,在满足2NF下,以满足属性之间没有间接关联。
总结
- 范式的目的是为了设计一个结构合理、数据规范的数据库。
- 但出于规范性和性能的考虑,最好关联查询的表不得超过三张,或故意增加某些表中的一些冗余字段将多表查询变成单表查询,获故意增加一些计算列将大数据量计算变成小数据量便于查询。