MySQL数据库三大范式详解

 前言

        MySQL数据库是一种常见的关系型数据库管理系统,具有广泛的应用范围。在使用MySQL数据库时,我们需要了解和遵守三大范式,以确保数据的准确性和一致性。本文将详细介绍MySQL数据库的三大范式及其应用。

为什么需要范式 

         一个软件项目基本都会用到数据库,项目开发前期分析客户的业务和数据处理需求,然后设计数据库的E-R模型图,确认需求信息的正确和完整。再就要将E-R图转换为多张表,表设计后,很可能结构不合理,出现数据重复保存,简称数据的冗余,这对数据的增删改查带来很多后患,所以我们需要审核是否合理,就像施工图设计后,还需要其他机构进行审核图纸是否设计合理一样。
        如何审核呢?需要一些有关数据库设计的理论指导规则,这些规则业界简称数据库的范式。数据库范式为数据库的设计、开发提供了一个可参考的典范。
        

那么范式的提出是为了解决什么问题?

比如用户表中的地址信息,拆分为省、市这种明确的字段,可以按独立的字段检索、查询。
第一范式,要求将列尽可能最小的分割,希望消除某个列存储多个值的冗余的行为

比如订单表中的商品分类、详情信息,只需要由商品信息表存储一份即可。
第二范式,要求唯一的主键,且不存在对主键的部分依赖,希望消除表中存在冗余的列

比如用户表中不需要存储额外的 其所在城市的人口、城市特点等信息。
第三范式,要求没有间接依赖于主键的列,即仍然是希望消除表中冗余的列

很明显,这些范式大都是为了消除冗余而提出的,即尽可能的减少存储成本。

三大范式详解 

第一范式(1NF):原子性

(每个列都不可以再拆分)

第一范式是关系型数据库的基础要求,它要求每个关系中的每个属性都应该具有原子性,即每个属性只包含单一的数据值,不能包含重复的数据或多个数据项。

例如,在一个学生表中,如果我们将学生的姓名和成绩存储在同一列中,那么就不符合第一范式。正确的做法应该是将学生的姓名和成绩分别存储在不同的列中,以确保每个属性具有原子性。

第二范式(2NF)关键字

( 在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分)

第二范式要求每个非主属性完全依赖于主键。即在关系中,如果有一个非主属性只依赖于主键的一部分,那么这个非主属性就应该被拆分为一个新的关系。

例如,在一个订单表中,如果我们将产品名称和产品价格存储在同一列中,而订单号作为主键,则产品名称和产品价格只依赖于订单号的一部分。在第二范式中,我们应该将产品名称和产品价格拆分为一个新的产品表,以确保每个非主属性完全依赖于主键。

第三范式(3NF):传递依赖                                                                                   

(在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键)

第三范式要求非主属性不依赖于其他非主属性。即在关系中,如果有一个非主属性依赖于另一个非主属性,那么这个非主属性就应该被拆分为一个新的关系。

例如,在一个员工表中,如果我们将部门名称存储在与部门编号不同的列中,那么部门名称就依赖于部门编号。在第三范式中,我们应该将部门名称拆分为一个新的部门表,以确保每个非主属性不依赖于其他非主属性。

        注意:要遵循后边的范式,就必须先遵循前面的范式要求,比如第二范式就必须先遵循第一范式的,第三范式必须先遵循第二范式,以此类推

 如何应用范式

        三范式的具体使用上面已经提到,这里想谈一下在实际工作中的数据库设计理念。
  借助三范式的理念,我们可以设计出很精炼的数据库表结构。理解范式是做好数据库设计的一门基础,比如选择合适的主键、清晰的划分每一列属性等等。
  而实际上的项目应用并不会完全遵循范式的理念,原因在于:

性能原因,没有任何冗余的表设计会产生更多关联以至于更多的查询行为,这意味着会产生更多次的数据库IO操作。在一些实时交互的系统中,就会慢得让人难以忍受。
数据存储成本,数据库范式是在20世纪提出的,当时的磁盘存储成本还很高。随着科技发展,数据存储的成本已经大幅度缩减,对于采用范式设计(规避冗余)带来的成本缩减收益已经不那么明显。对一些实际数据库应用,以时间换空间就不那么明智了。

 反范式化

        由于数据库的三大范式和数据库的性能有时是矛盾的。没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。
  具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余,达到以空间换时间的目的。 

总结 

三大范式是关系型数据库设计中的基本原则,它们确保数据的准确性和一致性,同时还能提高数据库的性能和可维护性。在使用MySQL数据库时,我们应该遵循这些原则来设计和维护数据库,以确保数据的可靠性和一致性。

除了上述的三大范式之外,还有一些其他的范式,例如BCNF和4NF等。在进行数据库设计时,我们需要根据实际需求和数据特点来选择最适合的范式,以确保数据的完整性和稳定性。

你可能感兴趣的:(数据库,数据库,mysql)