# 数据库设计范式
数据库中为了减少冗余、结构合理,设计数据库要遵循一定的规则,在关系型数据库中这种规则就是范式。
# 三大范式
## 第一范式:确保每列保持原子性
第一范式是最为基本的范式,如果数据库中所有的字段值都是不可分解的原子值,就说明该数据库满足第一范式。
第一范式的合理性有时要根据实际需求来看。比如有些数据库中的“地址”属性,本来直接将地址设计为一个数据表字段。但是如果数据库需求要经常访问“地址”中的城市部分,那么就有必要将这个属性重新拆分为省份、城市、详细地址等多个部分进行存储。
## 第二范式:确保表中每列都和主键相关
第二范式要确保数据表中的每一列都和主键相关,为不能只与主键的某一部分相关(主要针对联合主键而言)。也就是,在一个数据表中,一个表中只能保存一种数据,不可以把多种数据都保存到同一张数据表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号作为数据库表的联合主键。这样就存在一个问题,数据表中主键就变成了(订单编号+商品编号),表中的其他字段信息,如商品名称、单位、商品价格等信息就不与表的主键相关,而是仅仅与商品的编号相关,所以违背第二范式。
解决方法:拆分为不同表。
## 第三范式:确保每列都和主键列直接相关,而不是间接相关
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
# 其他规则
一个表中必须只有一个主键,且自增id。