Skip to main content

将数据库置于第一范式

4 09 规范化理论 范式 (可能 2024)

4 09 规范化理论 范式 (可能 2024)
Anonim

First Normal Form(1NF)为有组织的数据库设置基本规则:

  • 消除同一个表中的重复列。
  • 为每组相关数据创建单独的表,并使用唯一列(主键)标识每一行。

在考虑数据库的实际设计时,这些规则意味着什么?它实际上非常简单。

消除重复

第一条规则规定我们不得在表的同一行内复制数据。在数据库社区中,这个概念被称为表的原子性。符合此规则的表被认为是原子的。让我们用一个经典的例子探讨这个原则:人力资源数据库中存储管理者 - 从属关系的表。出于我们示例的目的,我们将强加业务规则,即每个经理可能有一个或多个下属,而每个下属可能只有一个经理。

直观地,在创建列表或电子表格以跟踪此信息时,我们可能会创建一个包含以下字段的表:

  • 经理
  • Subordinate1
  • Subordinate2
  • Subordinate3
  • Subordinate4

但是,请回忆1NF强加的第一条规则:从同一个表中删除重复列。显然,Subordinate1-Subordinate4列是重复的。花一点时间思考这个场景引发的问题。如果经理只有一个下属,则Subordinate2-Subordinate4列只是浪费的存储空间(一种珍贵的数据库商品)。此外,想象一下经理已经有4名下属的情况 - 如果她接手另一名员工会怎样?整个表结构需要修改。

此时,数据库新手通常会遇到第二个好主意:我们不希望拥有多个列,并且我们希望允许灵活的数据存储量。让我们尝试这样的事情:

  • 经理
  • 下属

Subordinates字段将包含“Mary,Bill,Joe”形式的多个条目。

这种解决方案更接近,但也达不到标准。下属列仍然是重复且非原子的。当我们需要添加或删除下属时会发生什么?我们需要读取和写入表的全部内容。在这种情况下,这不是什么大不了的事,但如果一位经理有一百名员工呢?此外,它使在将来的查询中从数据库中选择数据的过程变得复杂。

这是一张满足1NF第一条规则的表格:

  • 经理
  • 下属

在这种情况下,每个下属都有一个条目,但经理可能有多个条目。

识别主键

现在,第二条规则是什么:使用唯一列或一组列(主键)标识每一行。您可以查看上表并建议使用从属列作为主键。实际上,由于我们的业务规则指定每个下属可能只有一个管理器,因此下级列是主键的良好候选者。但是,我们选择存储在表中的数据使得这不是理想的解决方案。如果我们聘请另一位名叫吉姆的员工会怎样?我们如何将他的经理 - 下属关系存储在数据库中?

最好使用真正唯一的标识符(例如员工ID)作为主键。我们的决赛桌看起来像这样:

  • 经理ID
  • 从属ID

现在,我们的桌子是第一个正常形式!除此之外,如果您对更多组织感到兴奋,还可以选择将数据库放在第二范式和第三范式中。