ITPub博客

首页 > 数据库 > 数据库开发技术 > 数据基础系列:数据建模中的范式

数据基础系列:数据建模中的范式

原创 数据库开发技术 作者:flycrown 时间:2024-06-16 08:32:20 0 删除 编辑

如果您是数据库设计新手,您可能听说过数据库规范化。这是在数据库中组织数据的过程,使其一致、高效且易于管理。规范化有多个级别,每个级别都有自己的优点和用例。在本文中,我们将介绍规范化的基础知识,包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和其他高级范式。

范式

关系模型发明后,引入了规范化和范式的概念。数据库规范化是避免关系数据库管理系统不一致的必要程序。它应该在设计阶段执行。为此,应该将冗余字段重构为较小的部分。

范式是关系的定义结构,具有一组约束,关系必须满足这些约束才能检测数据冗余并纠正异常。执行数据库操作时可能出现以下异常:

  • 插入:数据已知但无法插入

  • 更新:更新数据需要修改多个元组(行)

  • 删除:删除一些数据会导致其他数据丢失

第一范式有初始约束,进一步的范式如2NF、3NF、BCNF、4NF、5NF会逐渐增加新的约束。换句话说,每个2NF也是1NF;每个3NF中的关系也是2NF。如果所有关系组都表示为集合,可以画出下图:

第一范式(1NF)

第一范式(1NF)是最简单的规范化级别。它涉及确保数据库中的每个表都有一个主键,并且表中的每一列都包含原子值。换句话说,表中的每一行都应具有唯一标识符,并且表中的每个值都应不可分割。

让我们举一个例子来更好地理解这一点。考虑一个存储员工信息的表。该表可能有employee_id、name、address和等列phone_number。但是,address列可能包含多个值,例如街道名称、城市、州和邮政编码。

为了使该表符合1NF,我们需要将address列拆分为单独的列,每列包含一个值。

第二范式(2NF)

第二范式(2NF)建立在1NF的基础上,涉及确保表中的每个非键列都依赖于主键。换句话说,表中不应存在部分依赖关系。

让我们继续讨论员工表示例。假设我们department在表中添加一列。如果我们发现列中的值department依赖于employee_id和name列,但不依赖于phone_number列,则我们需要将表拆分为两个表,一个用于员工信息,一个用于部门信息。

第三范式(3NF)

第三范式(3NF)建立在2NF的基础上,涉及确保表中的每个非键列不传递依赖于主键。换句话说,表中不应存在传递依赖关系。

让我们再举一个例子。考虑一个存储书籍信息的表。该表可能有book_id、title、author和等列publisher。

但是,publisher列可能依赖于author列,而不是依赖于book_id列。为了使此表符合3NF,我们需要将其拆分为两个表,一个用于书籍信息,一个用于作者信息。

BCNF—Boyce-Codd范式

Boyce-Codd范式(BCNF)是比3NF更高级别的规范化。它用于消除非关键属性之间存在函数依赖关系的可能性。当且仅当表中的每个决定因素都是候选键时,表才符合BCNF。

为了更好地理解BCNF,请考虑一个存储有关学生及其课程的信息的表。该表可能有student_id、course_id、instructor和等列instructor_office。在此表中,行列式为course_id,非关键属性为instructor。但是,一门课程可以有多个讲师,因此非关键属性之间可能存在函数依赖关系。要将此表转换为BCNF,我们需要将其拆分为两个表,一个用于课程信息,一个用于讲师信息。

第四范式(4NF)

第四范式(4NF)是最高级别的规范化,用于消除表中多值依赖关系的可能性。当一个或多个属性依赖于主键的一部分,但不依赖于整个主键时,就会发生多值依赖关系。

为了更好地理解4NF,请考虑一个存储有关员工及其技能的信息的表。该表可能有employee_id、skill和等列proficiency_level。在此表中,主键是employee_id和的组合skill。但是,熟练程度取决于技能,而不是整个主键。为了使此表符合4NF,我们需要将其拆分为两个表,一个用于员工信息,一个用于技能信息。

第五范式(5NF)

第五范式(5NF)是最高级别的规范化,也称为投影连接范式(PJNF)。它用于处理数据库中复杂的多对多关系。

在多对多关系中,每个表都有一个复合主键,主键和非键属性之间可能存在非平凡的函数依赖关系。5NF通过将表分解为保留属性之间关系的小表来处理这些情况。

为了更好地理解这一点,请考虑一个存储有关电影及其演员的信息的数据库。这些表可能有movie_id、actor_id、character_name和这样的列。在这个数据库中,主键(、)和属性salary之间可能存在非平凡的函数依赖关系。movie_idactor_idsalary

为了使该数据库符合5NF,我们需要将表分解为更小的表。例如,我们可以为电影、演员和角色创建表,然后使用连接表将它们连接起来。每个表都有一个主键,连接表将包含其他表的外键。

范式对照

如今,许多组织都依赖数据库来存储、管理和检索数据。为了确保以高效且一致的方式组织数据,通常会使用规范化。可以应用多个级别的规范化,其中最常用的是1NF、2NF和3NF。

除了1NF、2NF和3NF之外,还有Boyce-Codd范式(BCNF)、第四范式(4NF)和第五范式(5NF)等高级规范化技术。BCNF用于消除非关键属性之间存在函数依赖的可能性。4NF用于消除表中存在多值依赖的可能性。5NF也称为Project-Join范式(PJNF),用于处理数据库中复杂的多对多关系。

虽然这些级别的规范化可以提供进一步的数据一致性和管理优势,但它们也可能导致更复杂的表关系、更慢的查询和更大的表数量。因此,在数据库设计中应用每种技术之前,仔细考虑每种技术的用例和优势非常重要。



往期推荐

数据资产管理方案

通过两个阶段实现数据平台的现代化

数据基础系列:Lambda架构和Kappa架构

谈谈数据架构的演变和典型模式

谈谈汽车数据价值变现及收益分配

谈谈利用主数据改进数据分析的重要性

数据仓库中的7种建模方法及示例

谈谈在数据驱动中数据建模的重要性及建模方法


原文作者:数据驱动智能;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2022-11-11

  • 博文量
    331
  • 访问量
    178244