searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

数据设计的常见范式

2024-07-29 09:58:52
19
0

数据库设计的四大范式

前言

在日常的开发过程中,数据库作为数据存储和管理的核心组件,其设计质量直接影响数据处理的效率、数据的一致性和系统的可维护性,为了确保数据库数据的合理性和高效性,业界提出了一系列设计规范和标准,这些规范被统称为数据库设计范式。

目前,关系数据库设计主要遵循六大范式,从低到高依次为:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。每一级范式都是在前一级范式的基础上进一步提出的,更高的范式意味着更低的冗余度和更高的数据独立性。常用的是四大范式。

四大范式

(1)第一范式

在关系模式中,当且仅当所有属性只包含原子值,即每个分量都是不可再分的数据项,则称满足1NF。

举例:

系名称 高级职称人数
计算机系 16
电子系 10

该表所示的教师职称情况关系就不满足1NF,原因在于,该关系模式中的“高级职称人数”不是一个原子属性,若将其拆分为“教授”和“副教授”两个属性,则就满足1NF。

系名称 教授 副教授
计算机系 6 10
电子系 5 5

(2)第二范式

当且仅当关系模式及满足1NF , 且每个非键属性(即不属于任何候选键的属性,也称为非主属性)完全依赖于候选键时,则称满足2NF。

规则:

  • 所有的非主属性都必须完全依赖于主键。
  • 如果存在非主属性仅依赖于主键的一部分,则表不符合第二范式。
  • 如果表的主键是单一字段,并且所有非主属性都完全依赖于该主键,则该表一定符合第二范式。

举例:

课程类型 课程ID 课程名称
通识课 1 礼仪鉴赏
文学 2 大学语文
数学 3 高等数学
通识课 4 插花艺术
数学 5 数值分析

在这个例子中,主键是“课程类型”和“课程ID”的组合,因为它们一起能够唯一地标识表中的每一行。非主属性是“课程名称”。我们可以看到,“课程名称”完全依赖于主键(即“课程类型”和“课程ID”的组合),而不是仅依赖于主键的一部分。因此,这个表符合第二范式。符合第二范式的设计可以减少数据冗余、避免更新异常、插入异常和删除异常。如果一个表不符合第二范式,可能会导致数据在多个地方被重复存储,从而增加数据维护的复杂性和出错的可能性。通过将不符合第二范式的表进行拆分,可以使得每个表都更加专注于存储一组相关的数据,从而提高数据的独立性和一致性。

(3)第三范式

当且仅当关系模式R满足1NF ,且R中没有非键属性传递依赖于候选键时,则称满足3NF。

第三范式(Third Normal Form,简称3NF)是数据库设计中的一种重要规范化标准,它是在第二范式(2NF)的基础上进一步提出的。第三范式要求一个数据库表中,非主键列必须直接依赖于主键,而不能存在传递依赖。这意味着表中的每一列都直接和主键相关,而不是通过其他非主键列间接相关。

规则:

  • 非主键列必须直接依赖于主键。
  • 如果存在非主键A依赖于非主键B,并且B依赖于主键,那么实际上A对主键存在传递依赖,这是不符合第三范式的。

举例:

举例说明

假设我们有一个关于员工能力的表格,其内容如下:

部门编号 员工姓名 产出 职业等级
D001 张三 5 初级
D001 李四 6 中级
D002 王五 5.5 初级

在这个例子中,主键可以认为是“部门编号”和“员工姓名”的组合(虽然在实际应用中,员工姓名作为主键的一部分可能不是最佳选择,但此处仅用于说明)。非主属性包括“产出”和“职业等级”。

  • “产出”直接依赖于主键(部门编号和员工姓名的组合),因为它是由员工的部门和身份决定的。
  • 然而,“职业等级”在这里存在传递依赖问题,因为它实际上是由“产出”间接决定的,而不是直接由主键决定。即,职业等级依赖于产出,而产出又依赖于主键。

为了符合第三范式,我们需要将这个表拆分为两个表:

员工表:

部门编号 员工姓名 产出
D001 张三 5
D001 李四 6
D002 王五 5.5

产出等级表​:

产出 职业等级
4-5.5 初级
5.6-7 中级

在这个拆分后的设计中,每个表都更加专注于存储一组相关的数据,并且消除了传递依赖的问题。员工表直接存储了员工的部门、姓名和产出,而职业等级则通过另一个表来管理,并通过产出与产出表进行关联。

(4)BCNF范式

BCNF要求关系模式中的每个非主属性都完全依赖于候选键(Candidate Key),而不是依赖于其他非主属性或候选键的一部分。这意味着在BCNF中,不存在任何函数依赖关系,其中非主属性(即非键属性)依赖于其他非主属性或候选键的真子集。

BCNF,全称为Boyce-Codd Normal Form,中文常称为巴斯范式或鲍依斯-科得范式,是由Raymond F. Boyce和Edgar F. Codd在1974年提出的数据库设计中的一种规范化形式。它是在第三范式(3NF)的基础上进一步细化和完善的,旨在消除关系模式中的所有部分函数依赖,确保数据库中的数据更加规范化。

如何判断一个关系模式是否符合BCNF

要判断一个关系模式是否符合BCNF,需要进行以下步骤:

  1. 确定候选键​:首先,需要确定关系模式中的所有候选键。
  2. 检查函数依赖​:然后,检查关系模式中的每个函数依赖,确保每个非主属性都完全依赖于某个候选键。
  3. 排除部分依赖和传递依赖​:如果存在非主属性依赖于候选键的真子集或存在传递依赖,则关系模式不符合BCNF。

应用场景

BCNF广泛应用于关系数据库的设计和规范化过程中。在实际应用中,虽然通常只需要满足前三个范式(1NF、2NF、3NF)就足够了,但在某些对数据一致性和完整性要求极高的场景下,BCNF的应用显得尤为重要。

总之,BCNF是数据库设计中的一个重要概念,它通过消除关系模式中的部分函数依赖和传递函数依赖,确保数据库中的数据更加规范化、一致性和高效性。

备注:有几个概念,超键、候选键、主键、外键

超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键

候选键(candidate key):不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了
主键(primary key):用户选作元组标识的一个候选键程序主键
外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。

0条评论
0 / 1000
z****n
7文章数
0粉丝数
z****n
7 文章 | 0 粉丝
原创

数据设计的常见范式

2024-07-29 09:58:52
19
0

数据库设计的四大范式

前言

在日常的开发过程中,数据库作为数据存储和管理的核心组件,其设计质量直接影响数据处理的效率、数据的一致性和系统的可维护性,为了确保数据库数据的合理性和高效性,业界提出了一系列设计规范和标准,这些规范被统称为数据库设计范式。

目前,关系数据库设计主要遵循六大范式,从低到高依次为:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。每一级范式都是在前一级范式的基础上进一步提出的,更高的范式意味着更低的冗余度和更高的数据独立性。常用的是四大范式。

四大范式

(1)第一范式

在关系模式中,当且仅当所有属性只包含原子值,即每个分量都是不可再分的数据项,则称满足1NF。

举例:

系名称 高级职称人数
计算机系 16
电子系 10

该表所示的教师职称情况关系就不满足1NF,原因在于,该关系模式中的“高级职称人数”不是一个原子属性,若将其拆分为“教授”和“副教授”两个属性,则就满足1NF。

系名称 教授 副教授
计算机系 6 10
电子系 5 5

(2)第二范式

当且仅当关系模式及满足1NF , 且每个非键属性(即不属于任何候选键的属性,也称为非主属性)完全依赖于候选键时,则称满足2NF。

规则:

  • 所有的非主属性都必须完全依赖于主键。
  • 如果存在非主属性仅依赖于主键的一部分,则表不符合第二范式。
  • 如果表的主键是单一字段,并且所有非主属性都完全依赖于该主键,则该表一定符合第二范式。

举例:

课程类型 课程ID 课程名称
通识课 1 礼仪鉴赏
文学 2 大学语文
数学 3 高等数学
通识课 4 插花艺术
数学 5 数值分析

在这个例子中,主键是“课程类型”和“课程ID”的组合,因为它们一起能够唯一地标识表中的每一行。非主属性是“课程名称”。我们可以看到,“课程名称”完全依赖于主键(即“课程类型”和“课程ID”的组合),而不是仅依赖于主键的一部分。因此,这个表符合第二范式。符合第二范式的设计可以减少数据冗余、避免更新异常、插入异常和删除异常。如果一个表不符合第二范式,可能会导致数据在多个地方被重复存储,从而增加数据维护的复杂性和出错的可能性。通过将不符合第二范式的表进行拆分,可以使得每个表都更加专注于存储一组相关的数据,从而提高数据的独立性和一致性。

(3)第三范式

当且仅当关系模式R满足1NF ,且R中没有非键属性传递依赖于候选键时,则称满足3NF。

第三范式(Third Normal Form,简称3NF)是数据库设计中的一种重要规范化标准,它是在第二范式(2NF)的基础上进一步提出的。第三范式要求一个数据库表中,非主键列必须直接依赖于主键,而不能存在传递依赖。这意味着表中的每一列都直接和主键相关,而不是通过其他非主键列间接相关。

规则:

  • 非主键列必须直接依赖于主键。
  • 如果存在非主键A依赖于非主键B,并且B依赖于主键,那么实际上A对主键存在传递依赖,这是不符合第三范式的。

举例:

举例说明

假设我们有一个关于员工能力的表格,其内容如下:

部门编号 员工姓名 产出 职业等级
D001 张三 5 初级
D001 李四 6 中级
D002 王五 5.5 初级

在这个例子中,主键可以认为是“部门编号”和“员工姓名”的组合(虽然在实际应用中,员工姓名作为主键的一部分可能不是最佳选择,但此处仅用于说明)。非主属性包括“产出”和“职业等级”。

  • “产出”直接依赖于主键(部门编号和员工姓名的组合),因为它是由员工的部门和身份决定的。
  • 然而,“职业等级”在这里存在传递依赖问题,因为它实际上是由“产出”间接决定的,而不是直接由主键决定。即,职业等级依赖于产出,而产出又依赖于主键。

为了符合第三范式,我们需要将这个表拆分为两个表:

员工表:

部门编号 员工姓名 产出
D001 张三 5
D001 李四 6
D002 王五 5.5

产出等级表​:

产出 职业等级
4-5.5 初级
5.6-7 中级

在这个拆分后的设计中,每个表都更加专注于存储一组相关的数据,并且消除了传递依赖的问题。员工表直接存储了员工的部门、姓名和产出,而职业等级则通过另一个表来管理,并通过产出与产出表进行关联。

(4)BCNF范式

BCNF要求关系模式中的每个非主属性都完全依赖于候选键(Candidate Key),而不是依赖于其他非主属性或候选键的一部分。这意味着在BCNF中,不存在任何函数依赖关系,其中非主属性(即非键属性)依赖于其他非主属性或候选键的真子集。

BCNF,全称为Boyce-Codd Normal Form,中文常称为巴斯范式或鲍依斯-科得范式,是由Raymond F. Boyce和Edgar F. Codd在1974年提出的数据库设计中的一种规范化形式。它是在第三范式(3NF)的基础上进一步细化和完善的,旨在消除关系模式中的所有部分函数依赖,确保数据库中的数据更加规范化。

如何判断一个关系模式是否符合BCNF

要判断一个关系模式是否符合BCNF,需要进行以下步骤:

  1. 确定候选键​:首先,需要确定关系模式中的所有候选键。
  2. 检查函数依赖​:然后,检查关系模式中的每个函数依赖,确保每个非主属性都完全依赖于某个候选键。
  3. 排除部分依赖和传递依赖​:如果存在非主属性依赖于候选键的真子集或存在传递依赖,则关系模式不符合BCNF。

应用场景

BCNF广泛应用于关系数据库的设计和规范化过程中。在实际应用中,虽然通常只需要满足前三个范式(1NF、2NF、3NF)就足够了,但在某些对数据一致性和完整性要求极高的场景下,BCNF的应用显得尤为重要。

总之,BCNF是数据库设计中的一个重要概念,它通过消除关系模式中的部分函数依赖和传递函数依赖,确保数据库中的数据更加规范化、一致性和高效性。

备注:有几个概念,超键、候选键、主键、外键

超键(super key):在关系中能唯一标识元组的属性集称为关系模式的超键

候选键(candidate key):不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了
主键(primary key):用户选作元组标识的一个候选键程序主键
外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。

文章来自个人专栏
项目相关
7 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0