数据库设计三大范式

为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则,在关系型数据库中,范式是符合一种设计要求的总结,要想设计一个合理的关系型数据库,必须满足一定的范式

第一范式(确保每一列都是原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。
数据库设计三大范式

第二范式(确保表中每列都跟主键相关)

第二范式是在第一范式的基础上更进一层,第二范式需要确保数据库表中的每一列都和主键有关,如不能只与主键的一部分有关(针对联合主键来说),也就是说一个数据库表中,一个表只能保存一种数据,不可以把多种数据保存在同一张表中

比如要设计一个订单信息表,因为订单中可能会有多个商品,所以如果把订单号和商品号作为联合主键,如下图所示

数据库设计三大范式
这样就产生了一个问题,上述表中的商品名称、单位、价格只跟商品id有关而跟订单id无关,这就违反了第二范式的设计原则。

如果把订单表进行拆分,把商品信息分离到另外一种表中,把订单表也分离到另外一张表中就很完美了,如下图所示
数据库设计三大范式
数据库设计三大范式

第三范式(确保每列都和主键列直接相关,而不是间接相关)

在第二范式基础上,任何非主键不依赖于其它非主键(在第二范式基础上消除传递依赖)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
数据库设计三大范式
数据库设计三大范式