文章目录
- 第一范式:字段原子性,每个字段都不可再分,只代表一个含义,不能记录两个或两个以上含义的值。
- 第二范式:满足第一范式的条件下,有联合主键的表,非主键字段都依赖所有联合主键,即不能有非主键只依赖联合主键中的部分主键。
- 第三范式:满足第二范式的条件下,所有非主键都只依赖于主键而不依赖非主键。
- 总结
第一范式:字段原子性,每个字段都不可再分,只代表一个含义,不能记录两个或两个以上含义的值。
第二范式:满足第一范式的条件下,有联合主键的表,非主键字段都依赖所有联合主键,即不能有非主键只依赖联合主键中的部分主键。
如果存在个别非主键依赖于联合主键中的部分主键,则说明表还可以再拆分,可以将这个非主键和这些被依赖的部分主键拆到另外一张表中。
第三范式:满足第二范式的条件下,所有非主键都只依赖于主键而不依赖非主键。
如果一个非主键依赖另一个非主键,则说明表还可以再拆分,可以将这个非主键和它所依赖的非主键拆到另外一张表中。
总结
可见三大范式的目的是将表最大化精简,这样做的好处是减少数据冗余和尽可能地做到数据一致性。
想象一下,如果代表同一个意义的字段在多个表中都有存储,那不就是一种数据冗余码,这种数据冗余也给数据的一致性提高了难度。修改一个字段值,必须把所有相关表的相关字段都修改一遍,如果有一个表修改失败就造成多个表中代表同一含义的多个字段值数据不一致。
实际业务场景中,也不会完全按昭三大范式去设计数据库,因为太严格的话,会降低数据查询的性能。一个查询要查出想要的业务数据,通常要联表查询才能查出所有需要的数据,这肯定会降低数据库查询性能。所以为了提高查询效率也会违反第三范式,故意去设置一些冗余字段,比如按照第三范式一个表本来应该只记录了人员的id,但为了减少连表查询,增加了冗余字段;人员姓名。电话等。