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

时间:2015-02-13 08:40:25

标签: database database-design database-normalization

提前感谢您的了解。我正在攻读微软技术考试,其中一个练习题是:

创建主键满足第一个普通表单。对错吗?

我个人认为它是假的,因为第一个正常形式是摆脱重复的组。但是文中有一句话(数据库基础,微软出版社考试98-364),其中有以下内容:

“第一个规范化形式(1NF)表示数据采用实体格式,这基本上意味着必须满足以下三个条件: •表格必须没有重复记录。一旦为表定义了主键,就符合第一个规范化表单标准。“

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

5 个答案:

答案 0 :(得分:6)

我无法向五岁的孩子解释这个问题。我试过了。但我或许可以对这个问题有所了解。您需要知道的第一件事是多年来对1NF有多种定义,这些定义有时会相互冲突。这可能是您混淆的原因,或者至少是其中的一部分。

要知道的是,Ed Codd首次定义时的目的是什么。 Ed Codd在他1970年出版的论文中定义了First Normal Form,他称之为Normal Form。他在该论文中的目的是证明沿关系线构建的数据库将具有现有数据库具有的所有表达能力。现有数据库通常处理拥有一组子项的父项。例如,如果父数据项包含有关学生的数据,则每个孩子可能包含有关该学生正在学习的一门课程的数据。

通过允许关系的一个属性本身就是一个关系,你可以用数学关系来定义这样一个结构。我将称之为“嵌套”关系,尽管我不记得Ed Codd所说的。在定义数学关系后紧密模式化的关系数据模型时,Ed Codd出于各种原因想要禁止这样的结构。他的理由大多是实用的,以便建立第一个关系数据库更加可行。

因此,他将他的一些论文用于证明您可以将属性限制为“简单”值,而不会降低关系数据模型的表达能力。我现在要回避一下“简单”的意思,尽管它值得回归。他把这种限制称为“正常形式”。一旦发现第二个普通形式,正常形式就会重命名为第一个普通形式。

当构建关系数据库时,工程师决定使用称为“表”的数据结构。 (我不知道实际的历史,但这是近似的)。表是由行和列组成的逻辑结构。它可以被认为是一个记录数组,其中每个记录代表一行,所有记录都有相同的标题。

现在,如果您希望这样的结构表示关系,则必须引入一个限制,以防止两个行具有完全相同的值。如果你有这样的重复,这不代表一种关系。根据定义,关系具有不同的元素。这是主键的来源。具有主键的表不能有重复的行,因为它不能有重复的键。

但我还没有完成。你没有问这个问题,但它在堆栈溢出中已经出现了一千次,所以值得投入这里。设计师可以通过创建包含文本的列来打败Ed Codd的原始意图,而该文本又包含逗号分隔值。在Codd的原始表述中,值列表并不“简单”。

这对初学者非常有吸引力,因为它看起来更简单,更有效,用逗号分隔值来存储一个表,而不是为父记录创建两个表,为子记录创建另一个表,并在它们两者时加入它们一个查询需要。联接并不是新手的简单,他们确实需要一些计算机资源。

列设计中的CSV几乎在所有情况下都是不幸的设计。原因是某些可以通过索引快速完成的查询现在需要全表扫描。这可以将秒数分为几分钟或几分钟。它比加入要贵得多。

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

答案 1 :(得分:5)

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

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

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

1NF的本质是每个表必须有一个键,并且元组由每个属性的单个值组成。大多数基于SQL的系统都不支持"重复组" (单个属性位置中有多个值)所以通常可以肯定地说,如果一个SQL表有一个键并且在任何属性位置都不允许空值,那么它就是"关系"并且满足1NF的精神。

答案 2 :(得分:2)

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

例如

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


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

这两条记录不同,因为字段KEY不同。 因此,虽然其余数据相同,但它符合1NF的要求。

答案 3 :(得分:1)

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

  

第一个规范化形式(INF)表示数据采用实体格式,   这基本上意味着必须满足以下三个条件:
  •表格必须没有重复记录。 [...]
  •该表也不能具有多值属性,这意味着   你不能在一个列中组合多个值   被认为对列有效。 [...]
  •列或属性中的条目必须具有相同的数据   类型。

(术语"1NF" is full of confusions, vagueness and changes的历史。但这是本文所说的内容。)

答案 4 :(得分:0)

让我参加聚会;)

对于一个问题“1NF中的这种关系”有意义,你首先需要一个关系。为了使你的桌子成为一种关系,你需要一把钥匙。没有任何键的表不是关系。

为什么呢?因为relation是一个 set (元组/行),并且一个set不能多次包含同一个元素(否则它将是multiset),这是由一个键确保的。

通过拥有密钥获得关系后,您可以查看所有属性是否为atomic,如果属于,则您自己拥有1NF。

答案是......

  

创建主键满足第一个普通表单。对错吗?

...是假的。你确实需要一把钥匙,但需要原子性。