第一范式
第二范式
一张表是一个独立的对象,一张表只表达一个意思。
第二范式要求,再满足第一范式的基础上,还要满足数据表里每一条数据都是唯一可标识的,而且所有非主键子段,都必须完全依赖主键,不能只依赖主键的一部分
对于非主属性来说,并非完全依赖候选键,这样会产生怎样的问题呢?
- 数据冗余
- 插入异常
- 删除异常
- 更新异常
第二范式 2NF 要求实体的属性完全依赖主关键字,如果不完全依赖,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体, 新实体与元实体之间是一对多的关系。
第三范式
第三范式在第二范式的基础上,确保数据表中的每个非主关键字段与主键子段直接相关。也就是说, 要求数据表中的所有非主键子段不能依赖于其他非主键子段。 即 (不能纯在非主属性A依赖于非主属性B, 非属性b依赖于主键C的情况,即存在 A->B->C 的决定关系 ) 通俗地讲,该规则的意思是所有非主键属性之间不能有依赖关系,必须相互独立。
2NF和3NF通常以这句话概括: 每个非键属性依赖于键,依赖于整个键,并且除了这个键别无他物。
总结
- 第一范式确保了每列保持原子性,每一列都是不可分割的原子数据项,不可再分的最小数据单元,而不能是集合、数组、记录等非原子数据项。
- 第二范式确保每列表都和主键完全依赖。
- 第三范式, 确保每列都和主键直接相关,而不是间接相关。
范式的优点
数据的标准化有助于消除数据库中的数据冗余,第三范式通常被认为在性能、扩展性和数据完整性方面达到了最好的平衡。范式的缺点
范式的使用,能降低查询的效率,因为范式等级越高,设计出来的表就越多、越精细、数据的冗余度就越低,进行查询的时候就需要关联多张表,这不但代价昂贵,也可能使一些索引无效。相关文章
https://blog.csdn.net/weixin_33446857/article/details/115176494
https://segmentfault.com/a/1190000013695030
