范式一共6层,范式也叫Normal Format
一般只需要满足前三个范式,既1NF,2NF,3NF即可。因为越往下层,节省空间会越多,要求越严格,但是效率也会因此大打折扣。使用范式可以减少设计数据库的数据冗余。
第一范式,1NF
每个字段满足原子性,不可再拆分,如下所示,商品表的时间,存在进货时间和卖出时间,2者之间是可以再拆分的,既不是原子性的
遵从第一范式,应该修改成如下所示
第二范式,2NF
存在复合主键,且其他字段依赖部分主键,则不满足第二范式。
如下表,通过复合主键可以确定唯一的数据,复合主键为name和shop_name。其中shop_address依赖shop_name,而price则依赖name。则此时就不满足第二范式。
解决的方法:
添加逻辑主键,取消复合主键的使用。
第三范式,3NF
存在传递依赖,比如上表中price依赖name,而name又依赖id(价格依赖白菜这个品种,而白菜又依赖逻辑主键id)。shop_address和shop_name也一样。这就存在了传递依赖。
解决的方法:
将存在传递依赖的,拆分成几个表通过,逻辑主键连接。如下表所示。
逆规范化
有时候在设计表的时候,如果一张表中有几个字段是需要从另外一个表中去获取信息,理论上讲,的确可以获取到想要的数据,但是效率会降低。所在开发中会刻意在某些表中不去保存另外表的主键(逻辑主键),而是直接保存想要的数据信息。这样一来,在查询数据的时候,一张表可以直接提供数据,而不需要多表查询。
逆规范化就是磁盘存储空间和效率的对抗。