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

use*_*821 2 database database-design database-normalization

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

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

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

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

请帮助我理解这一点,请解释,就像我五岁.谢谢.

Wal*_*tty 6

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

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

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

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

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

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

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

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

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

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


nvo*_*gel 5

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

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

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

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

  • 你所说的在政治上(1)是正确的,但你是否有信心它也会在他的考试中获得积分?(1)根据真实关系模型的政治性. (3认同)