freeCodeCamp/guide/chinese/computer-science/databases/normal-form/index.md

5.0 KiB
Raw Blame History

title localeTitle
Normal Form 正常形式

正常形式

归一化首先作为关系模型的一部分引入。它是以减少冗余和提高完整性的方式组织数据表和列的过程。这可以通过以下方式完成:

  • 合成:基于一组已知的依赖关系创建规范化的数据库设计。
  • 分解:采用现有的(规范不足的)数据库设计,并根据已知的依赖关系集对其进行改进

有三种常见的常规形式第1第2和第3加上一种称为BCNF的相当高级的形式。它们是渐进的除了符合第3范式之外数据库模式必须满足第2范式的规则对于第1范式也是如此。

  • 第一范式 :信息存储在表中,每列包含原子值,并且没有重复的列组。这个
  1. 消除各个表中的重复组。
  2. 为每组相关数据创建单独的表。
  3. 使用主键标识每组相关数据

违反第一范式的设计,“电话”列不包含原子值

|客户ID |名字|姓氏|电话| | ------------- | ------------ | ----------- | ---------- ---------------------------- | | 123 | Pooja |辛格| 555-861-2025,192-122-1111 | | 789 |约翰| Doe | 555-808-9633 | | 456 | San |张| 555403-1659分机53; 182-929-2929 |

一种解决方案是为每个电话号码增加一列。但是,这将在概念上重复相同的属性(电话号码)。此外,添加额外的电话号码将需要通过添加更多列重新组织表。这绝对不是实际的。

另一个解决方案是为关联客户提供一个单独的表< - >电话:这尊重第一个普通表格,每个客户可以根据需要设置多个行。

|客户ID |名字|姓氏| | ------------- | ------------ | ----------- | | 123 | Pooja |辛格| | 789 |约翰| Doe | | 456 | San |张|

|客户ID |电话| | ------------- | ------------------------ | | 123 | 555-861-2025 | | 123 | 192-122-1111 | | 789 | 555-808-9633 | | 456 | 555403-1659分机53 | | 456 | 182-929-2929 |

  • 第二范式 :表格为第一范式,所有非键列依赖于表的主键。这缩小了桌子的目的。

违反第二范式的设计。模型全名是主键,还有其他候选键,如{manufacturermodel}。 “制造商国家/地区”列取决于非键列(制造商)。

|制造商|型号|型号全名|制造商国家| | --------------------- | -------------- | ------------ ---------- | ---------------------- | |复地| X-Prime | Forte X-Prime |意大利| |复地| Ultraclean | Forte Ultraclean |意大利| | Dent-o-Fresh | EZbrush | Dent-o-Fresh EZbrush |美国| |小林| ST-60 |小林ST-60 |日本| | Hoch | Toothmaster | Hoch Toothmaster |德国| | Hoch | X-Prime | Hoch X-Prime |德国|

规范化设计将分为两个表,如下所示:

|制造商|制造商国家| | --------------------- | ---------------------- | |复地|意大利| | Dent-o-Fresh |美国| |小林|日本| | Hoch |德国|

|制造商|型号|型号全名| | --------------------- | -------------- | ------------ ---------- | |复地| X-Prime | Forte X-Prime | |复地| Ultraclean | Forte Ultraclean | | Dent-o-Fresh | EZbrush | Dent-o-Fresh EZbrush | |小林| ST-60 |小林ST-60 | | Hoch | Toothmaster | Hoch Toothmaster | | Hoch | X-Prime | Hoch X-Prime |

  • 第3范式 :表格为第二范式,其所有列都不可传递地依赖于主键。 如果可以从中导出列,则称该列依赖于另一列,例如,年龄可以从生日得到。传递性意味着这种依赖性可能涉及其他列。例如,如果我们考虑三列PersonID BodyMassIndex IsOverweight ,则列'IsOverweight'通过'BodyMassIndex'过渡依赖于'personID'。

违反第3范式的设计。 {TournamentYear}是表格的主键“Winner出生日期”栏目过渡依赖于它。

|比赛|年|获胜者|获胜者出生日期| | ---------------------- | ------------- | ------------ ---- | ---------------------- | |印第安纳州邀请赛| 1998年| Al Fredrickson | 1975年7月21日| |克利夫兰公开赛1999年| Bob Albertson | 1968年9月28日| |得梅因大师赛1999年| Al Fredrickson | 1975年7月21日| |印第安纳州邀请赛| 1999年| Chip Masterson | 1977年3月14日|

符合第3范式的设计将是

|比赛|年|获胜者|
| ---------------------- | ------------- | ------------ ---- | |印第安纳州邀请赛| 1998年| Al Fredrickson | |克利夫兰公开赛1999年| Bob Albertson | |得梅因大师赛1999年| Al Fredrickson | |印第安纳州邀请赛| 1999年| Chip Masterson |

|获胜者|出生日期| | ---------------- | ------------------- | | Chip Masterson | 1977年3月14日| | Al Fredrickson | 1975年7月21日| | Bob Albertson | 1968年9月28日|

更多信息: