DBMS 规范化:1NF、2NF、3NF 数据库示例
什么是数据库规范化?
正常化 是一种数据库设计技术,可减少数据冗余并消除插入、更新和删除异常等不良特征。规范化规则将较大的表划分为较小的表并使用关系链接它们。SQL 中的规范化的目的是消除冗余(重复)数据并确保数据以逻辑方式存储。
的发明者 关系模型 Edgar Codd 提出了数据规范化的理论,引入了第一范式,并以第二范式和第三范式不断扩展理论。 Later 他与雷蒙德·F·博伊斯 (Raymond F. Boyce) 合作发展了博伊斯-科德范式 (Boyce-Codd Normal Form) 理论。
DBMS 中的范式类型
以下是 SQL 中的范式列表:
- 1NF(第一范式): 确保数据库表的组织方式使得每列包含原子(不可分割)值,并且每条记录都是唯一的。这样可以消除重复组,从而将数据结构化为表和列。
- 2NF(第二范式): 基于 1NF 构建,我们需要从应用于多行的表中删除冗余数据。并将它们放在单独的表中。它要求所有非键属性在主键上完全发挥作用。
- 3NF(第三范式): 通过确保所有非键属性不仅在主键上完全发挥作用,而且彼此独立,扩展了 2NF。这消除了传递依赖性。
- BCNF(Boyce-Codd范式): 3NF 的改进版,解决了 3NF 无法处理的异常问题。它要求每个决定因素都是候选键,从而确保更严格地遵守规范化规则。
- 4NF(第四范式): 解决多值依赖关系。它确保记录中不存在关于实体的多个独立多值事实。
- 5NF(第五范式): 也称为“投影连接范式”(PJNF),它涉及从较小的、不同排列的数据片段重建信息。
- 6NF(第六范式): 仅是理论上的,尚未得到广泛实施。它通过进一步分解表格来消除所有非时间冗余,从而处理时间数据(处理随时间而发生的变化)。
数据规范化理论 MySQL 服务器仍在进一步开发中。例如,甚至在 6th 正常形式。 然而,在大多数实际应用中,规范化在 3 中达到最佳效果rd 范式SQL 理论中规范化的演变如下:
数据库规范化示例
数据库 规范化示例 借助案例研究,很容易理解。假设一个视频库维护着一个出租电影的数据库。数据库中没有任何规范化,所有信息都存储在一个表中,如下所示。让我们通过带有解决方案的规范化示例来了解规范化数据库:
在这里你看到 已租借电影列有多个值。 现在让我们进入第一范式:
第一范式(1NF)
- 每个表格单元格应包含一个值。
- 每条记录都必须是唯一的。
上表符合 1NF 规范
1NF 示例
在继续之前,我们先了解一些事情——
SQL 中的 KEY 是什么
A SQL 中的键 是用于唯一标识表中记录的值。SQL KEY 是用于唯一标识表中的行或元组的单个列或多个列的组合。SQL Key 用于识别重复信息,还有助于建立数据库中多个表之间的关系。
注意:表中不用于唯一标识记录的列称为非键列。
什么是主键?
主值是用于唯一标识数据库记录的单列值。
它具有以下属性
- A 主键 不能为 NULL
- 主键值必须是唯一的
- 主键值很少应该改变
- 插入新记录时必须给主键赋值。
什么是复合键?
复合键是由多个列组成的主键,用于唯一地标识一条记录
在我们的数据库中,有两个同名的人,分别是 Robert Phil,但他们住在不同的地方。
因此,我们需要全名和地址来唯一地标识一条记录。这是一个复合键。
让我们进入第二范式 2NF
第二范式(2NF)
- 规则 1- 符合 1NF
- 规则 2- 单列主键在功能上不依赖于任何候选键关系的子集
显然,我们无法在 2 中创建我们的简单数据库nd 除非我们对上面的表进行分区,否则就形成规范化形式。
我们将 1NF 表分为两个表,即表 1 和表 2。表 1 包含会员信息。表 2 包含租借电影的信息。
我们引入了一个名为 Membership_id 的新列,它是表 1 的主键。可以使用会员 ID 在表 1 中唯一地标识记录
数据库——外键
在表 2 中,Membership_ID 是外键
外键引用另一个表的主键!它有助于连接您的表
- 外键可以与其主键有不同的名称
- 确保一个表中的行在另一个表中有对应的行
- 与主键不同,它们不必是唯一的。通常它们不是
- 外键可以为空,尽管主键不能为空
为什么需要外键?
假设一个新手在表 B 中插入一条记录,例如
您只能将父表中唯一键中存在的值插入外键中。这有助于实现引用完整性。
可以通过将表 2 中的成员 ID 声明为表 1 中成员 ID 的外键来解决上述问题
现在,如果有人尝试在会员 ID 字段中插入父表中不存在的值,则会显示错误!
什么是传递函数依赖?
及物动词 函数依赖 更改非关键列时可能会导致其他非关键列发生更改
考虑表 1。更改非键列“全名”可能会更改“称呼”。
让我们进入 3NF
第三范式(3NF)
- 规则 1- 符合 2NF
- 规则 2- 没有传递函数依赖
为了将我们的 2NF 表移到 3NF,我们需要再次划分我们的表。
3NF 示例
下面是 SQL 数据库中的 3NF 示例:
我们再次划分了表格并创建了一个存储称呼的新表。
没有传递函数依赖关系,因此我们的表符合 3NF
在表 3 中,称呼 ID 是主键,而在表 1 中,称呼 ID 与表 3 中的主键无关
现在,我们的小示例处于无法进一步分解以获得 DBMS 中更高范式类型的规范化的级别。事实上,它已经处于更高的规范化形式。在复杂的数据库中,通常需要单独努力才能进入下一个规范化数据级别。但是,我们将在下文中简要讨论 DBMS 中的下一个规范化级别。
Boyce-Codd 范式 (BCNF)
即使数据库处于 3rd 正常形式,但如果有多个,则会导致异常 候选人 键。
有时 BCNF 也被称为 3.5 范式。
第四范式(4NF)
如果没有任何数据库表实例包含两个或多个描述相关实体的独立多值数据,则它属于 4th 正常形式。
第五范式(5NF)
5 中有一张桌子th 仅当它符合 4NF 时才是范式,并且它不能在不丢失数据的情况下分解为任意数量的较小表。
第六范式(6NF)提案
6th 范式不是标准化的,然而,数据库专家已经讨论了一段时间。希望我们能对 6 有一个清晰而标准化的定义th 不久的将来的正常形式……
范式的优点
- 提高数据一致性: 规范化可以确保每条数据只存储在一个地方,从而减少数据不一致的机会。当数据更新时,只需在一个地方更新,从而确保一致性。
- 减少数据冗余: 规范化有助于通过将数据分成多个相关表来消除重复数据。这可以节省存储空间,还可以提高数据库的效率。
- 提高查询性能: 规范化的数据库通常更易于查询。由于数据是按逻辑组织的,因此可以优化查询以加快运行速度。
- 使数据更有意义: 规范化涉及以合理且直观的方式对数据进行分组。这可以使数据库更易于理解和使用,尤其是对于没有设计数据库的人来说。
- 减少异常发生的机会: 异常是添加、更新或删除数据时可能发生的问题。规范化可以确保数据按逻辑顺序组织,从而减少出现这些异常的可能性。
标准化的缺点
- 复杂性增加: 规范化会导致复杂的关系。大量带有外键的表可能难以管理,从而导致混乱。
- 灵活性降低: 由于规范化规则严格,存储不遵守这些规则的数据可能会缺乏灵活性。
- 增加存储要求: 虽然规范化可以减少冗余,但可能需要分配更多的存储空间来容纳额外的表和索引。
- 性能开销: 连接多个表可能会对性能造成很大影响。数据越规范化,需要的连接就越多,这会减慢数据检索时间。
- 数据上下文丢失: 规范化将数据分解到单独的表中,这可能会导致业务上下文丢失。检查相关表对于了解数据上下文是必不可少的。
- 需要专业知识: 实现规范化数据库需要深入了解数据、数据之间的关系以及规范化规则。这需要专业知识,而且可能非常耗时。
这就是 SQL 规范化的全部内容!!!
结语
- 数据库设计 对于成功实施满足企业系统数据要求的数据库管理系统至关重要。
- DBMS 中的规范化是一个有助于生成具有更好的安全模型的数据库系统的过程。
- 函数依赖性是规范化数据过程中非常重要的组成部分
- 大多数数据库系统都是符合 DBMS 中的第三范式的规范化数据库。
- 主键唯一地标识表中的记录,并且不能为空
- 外键帮助连接表并引用主键