像我五岁一样解释 -> 主键如何满足第一范式

Explain Like I am Five -> How a Primary Key Satisfies First Normal Form

提前感谢您的了解。我正在为 Microsoft 技术考试学习,练习题之一是:

创建主键满足第一范式。对还是错?

我个人认为是False,因为第一范式是去掉重复组。但是课文中有一句话(数据库基础,微软出版社的考试98-364)是这样说的:

》第一种规范化形式(1NF)表示数据是实体格式,基本上意味着必须满足以下三个条件: • table 不能有重复记录。为 table 定义主键后,您就满足了第一个规范化形式标准。"

请帮助我理解这一点,请像我五岁一样解释。谢谢。

主键必须是完全唯一的。因此,一旦这是记录的一部分,它就不同于任何其他记录。

例如

Record 1
---------
KEY = 1
Name = Fred Boggs
Age = 84


Record 2
--------
KEY = 2
Name = Fred Boggs
Age = 84

这2条记录是不同的,因为字段KEY不同。 因此,虽然其余数据相同,但满足1NF的要求。

第一范式主要是定义问题而不是设计问题。在关系系统中,数据结构是关系变量。由于关系总是由唯一的元组组成,因此关系变量总是至少有一个候选键。按照惯例,我们将每个关系的一个键称为 "primary" 键,因此在关系数据库中,始终满足主键要求。

类似地,在关系数据库中,所有属性都包含可通过名称而不是位置索引来识别的值,因此 "repeating groups" 的问题不适用。 "repeating group" 的概念存在于某些 非关系 系统中,这就是 Codd 最初定义 1NF 时所指的内容。

然而,1NF 的解释问题出现了,因为大多数现代 DBMS 并不是真正的关系,尽管人们试图像关系系统一样使用它们。由于 SQL DBMS 不是关系型的,我们如何在 SQL DBMS 中解释关系概念,如 1NF?

1NF 的本质是每个 table 必须有一个键,并且元组由每个属性的单个值组成。大多数基于 SQL 的系统不支持 "repeating groups" 的概念(单个属性位置中的多个值)因此通常可以安全地说,如果 SQL table有一个键并且在任何属性位置都不允许空值那么它是 "relational" 并且满足 1NF 的精神。

我无法向一个五岁的孩子解释这些东西。我试过了。但是我也许可以对这个主题有所了解。首先你需要知道的是,多年来 1NF 有多种定义,这些定义有时会相互冲突。这很可能是您困惑的根源,或者至少是其中的一部分。

了解埃德·科德 (Ed Codd) 最初定义它时的目的是什么,这很有用。 Ed Codd 在他 1970 年发表的论文中定义了第一范式,他将其称为范式。他在那篇论文中的目的是证明按照关系线构建的数据库将具有现有数据库所具有的所有表达能力。现有数据库通常处理拥有一组 children 的 parent。例如,如果 parent 数据项包含有关学生的数据,则每个 child 可能包含有关该学生正在修读的一门课程的数据。

您实际上可以根据数学关系来定义这样的结构,方法是允许关系的一个属性本身就是一个关系。我打算将其称为 "nesting" 关系,但我不记得 Ed Codd 是如何称呼它的。在定义紧密仿照数学关系的关系数据模型时,出于各种原因,Ed Codd 希望禁止这种结构。他的理由大多是实际的,使构建第一个关系数据库更可行。

因此,他在论文中用了一些篇幅来证明您可以将属性限制为 "simple" 值,而不会降低关系数据模型的表达能力。我将暂时回避 "simple" 的含义,尽管它值得回过头来。他称这个限制为"normal form"。一旦发现第二范式,范式就被重命名为第一范式。

当需要构建关系数据库时,工程师们决定采用一种称为 "table" 的数据结构。 (我不知道实际的历史,但这是大概的)。 table 是由行和列组成的逻辑结构。可以认为是一个记录数组,每条记录代表一行,所有记录都相同header。

现在,如果您想要这样的结构来表示关系,则必须加入一个限制,以防止两行具有完全相同的值。如果您有这样的重复项,则这不代表关系。根据定义,关系具有不同的元素。这就是主键的用武之地。具有主键的 table 不能有重复的行,因为它不能有重复的键。

但我还没有完成。你没有问这个,但它在堆栈溢出中出现了一千次,所以它值得放在这里。设计师可以通过创建包含文本的列来打败 Ed Codd 的初衷,而文本又包含以逗号分隔的值。在 Codd 的原始公式中,值列表不是 "simple"。

这对新手非常有吸引力,因为它看起来更简单、更有效,用逗号分隔值存储 table 比创建两个 table 一个用于 parent 记录另一个用于 child 记录,并在一个查询都需要它们时加入它们。加入对于新手来说并不简单,而且它们确实占用了一些计算机资源。

几乎在所有情况下,列设计中的 CSV 都是一个不幸的设计。原因是某些本来可以通过索引快速完成的查询现在需要完整的 table 扫描。这可以将秒变成分钟或将分钟变成小时。它比连接贵得多。

所以你必须教新手为什么对所有数据进行密钥访问是一件好事,这意味着你必须教他们 1NF 的真正含义。这可能和教一个五岁的孩子一样困难。新手通常不像五岁的孩子那么无知,但他们往往更固执。

您只是引用了文本数据库管理基础知识的一个片段。更完整的报价是:

The first normalized form (INF) means the data is in an entity format, which basically means that the following three conditions must be met:
• The table must have no duplicate records. [...]
• The table also must not have multivalued attributes, meaning that you can't combine in a single column multiple values that are considered valid for a column. [...]
• The entries in the column or attribute must be of the same data type.

(术语 的历史。但这是本文所说的内容。)

让我加入派对;)

要使问题 "is this relation in 1NF" 有意义,您首先需要一个关系。要使 table 成为一种关系,您需要一把钥匙。没有任何键的 table 不是关系。

为什么?因为关系是一个 set(tuples/rows)并且一个集合不能多次包含相同的元素(否则它将是多重集),这是由一个键确保的。

一旦通过键建立了关系,您就可以查看是否所有属性都是 atomic,如果是,您自己就有一个 1NF。

所以答案...

Creating a primary key satisfies the first normal form. True or False?

...是错误的。您确实需要密钥,但您需要原子性。