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

Database 像我五岁一样解释->;主键如何满足第一范式,database,database-design,database-normalization,Database,Database Design,Database Normalization,提前感谢您的知识。我正在准备微软技术考试,其中一个练习题是: 创建主键满足第一个范式。对还是错 我个人认为这是错误的,因为第一个标准形式是消除重复组。但是文本中有一句话(数据库基础,微软出版社98-364考试)说: “第一个规范化表单(1NF)表示数据采用实体格式,这基本上意味着必须满足以下三个条件: •表不能有重复记录。一旦定义了表的主键,就满足了第一个规范化表单标准。” 请帮助我理解这一点,请像我五岁那样解释。谢谢。主键必须是完全唯一的。因此,一旦这是一个记录的一部分,它就不同于任何其他记录

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

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

我个人认为这是错误的,因为第一个标准形式是消除重复组。但是文本中有一句话(数据库基础,微软出版社98-364考试)说:

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


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

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

例如

这两条记录不同,因为字段键不同。
因此,尽管其余数据相同,但它满足1NF的要求。

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

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

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


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

我无法向五岁的孩子解释这一点。我试过了。但我也许能在这个问题上透露一些信息。您需要知道的第一件事是,多年来1NF有多种定义,这些定义有时相互冲突。这很可能是你困惑的根源,或者至少是其中的一部分

要知道一件有用的事情是Ed Codd第一次定义它的目的。EdCodd在1970年发表的论文中定义了第一个范式,他称之为范式。他在那篇论文中的目的是证明,沿着关系线构建的数据库将具有现有数据库所具有的所有表达能力。现有数据库通常处理拥有一组子数据库的父数据库。例如,如果父数据项包含有关学生的数据,则每个子数据可能包含有关该学生正在学习的一门课程的数据

实际上,您可以通过允许关系的一个属性本身就是一个关系来定义这种数学关系结构。我将称之为“嵌套”关系,尽管我不记得Ed Codd是怎么称呼它的。在定义密切遵循数学关系的关系数据模型时,Ed Codd出于各种原因希望禁止这种结构。他的理由大多是实用的,以使建立第一个关系数据库更加可行

因此,他在论文中花了一些时间来证明,可以将属性限制为“简单”值,而不会降低关系数据模型的表达能力。我现在要回避“简单”的含义,尽管它值得我们回头讨论。他称这种限制为“标准形式”。一旦发现第二个范式,范式就被重命名为第一个范式

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

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

但我还没做完。您并没有问这个问题,但它在堆栈溢出中出现了上千次,所以值得放在这里。设计师可以通过创建包含文本的列来挫败Ed Codd的初衷,而文本又包含逗号分隔的值。在Codd的原始公式中,值列表并不“简单”

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

在几乎所有情况下,列设计中的CSV都是不幸的设计。我
Record 1
---------
KEY = 1
Name = Fred Boggs
Age = 84


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