简明易懂的介绍数据库三个范式 (数据库三个范式)
数据库范式是数据库规范化的基础,它包括对表的设计和优化。数据库范式能够帮助开发人员理解和组织数据。是数据库设计中非常重要的概念。同时,三个范式还是数据库设计过程中的关键概念之一。
本文将会简要介绍数据库范式的三个级别:之一范式、第二范式和第三范式。
之一范式
之一范式是数据库中的最基础的一种范式规则,也是其他两个范式(2NF 和 3NF)的基础。之一范式要求所有的数据都必须有原子性,即单一不可分割。每一行数据都需要只有一个主键,不能存在多值字段或不同类型的数据。
例如,学生数据表中每一行只能存储一个学生的信息。一个学生的信息必须包含姓名、性别、年龄、学号等属性,没有其它多值属性,且每个属性只包含原子值,不能包含一组数据。
图1:学生表的之一范式
第二范式
第二范式(2NF)要求表必须满足之一范式并且所有非主键字段必须完全依赖于主键,而不能依赖于主键的部分属性。在这里,主键是指唯一地标识每一行记录的字段或字段的。
例如,下面这张地址表就不符合第二范式:
图2:地址表的第二范式
在这张表里,每一行数据都有一个独一无二的地址编号(addressID),同时还记录了省份信息(province),县市信息(city),以及详细地址信息(street)。由于非主键字段依赖于主键的一部分字段,即省份和县市信息都依赖于地址编号,而不是全部依赖于主键,因此,这张表不符合第二范式。
正确的设计应该是将省份和县市信息提取出来形成一个新的表,然后将它们通过地址编号和新的表进行连接。这样可以避免数据冗余和不一致,同时也能够保持表维护的灵活性。
图3:更改后的地址表的第二范式
第三范式
第三范式(3NF)要求每一张表不能存在对于主键的传递依赖性。即所有非主键字段必须直接依赖主键,不能间接依赖主键。
要理解传递依赖性,我们可以看一下如下的销售表:
图4:销售表的第三范式
在这个表中,订单号(orderID)是主键。还可以发现,商品名称(productName)和商品价格(price)都依赖于productID(即订单号和商品编号形成的复合主键)。显然这个表不符合第三范式,因为商品价格(price)同样依赖于商品名称(productName),因而造成了数据冗余。
为了修正这个问题,需要将商品和商品价格信息提取到商品表中,同时在销售表中只记录商品ID和数量信息。这样就避免了数据冗余和不一致性,同时也保持了数据的逻辑一致性。
图5:更改后的销售表的第三范式
数据库是现代计算机存储、管理数据的重要工具,范式则是为了保证数据库规范化的关键规则之一。在数据库设计时,我们应该始终遵循不同范式所规定的规则,以保证数据的一致性、完整性、可靠性和易维护性。这个过程中,尤其应该重视第三范式,因为如果数据存在传递依赖性就会出现冗余数据,造成数据冗余、数据不一致、处理效率下降。