【问题标题】:Explain Like I am Five -> How a Primary Key Satisfies First Normal Form像我五岁一样解释 -> 主键如何满足第一范式
【发布时间】:2015-04-14 06:04:23
【问题描述】:

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

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

我个人认为是 False,因为第一个范式是去掉重复的组。但是文本中有一句话(Database Fundamentals,Exam 98-364 by Microsoft Press)是这样说的:

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

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

【问题讨论】:

  • 1NF 还要求不能存在主键本身不能保证的重复组。所以我认为“*一旦你为表定义了主键,你就满足了第一个规范化的表单标准*”的说法是错误的。
  • 您没有引用所有三个标准。看我的回答。有本书的pdf链接here

标签: database database-design database-normalization


【解决方案1】:

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

一个有用的信息是 Ed Codd 在第一次定义它时的目的是什么。 Ed Codd 早在 1970 年发表的论文中就定义了第一范式,他称之为范式。他在那篇论文中的目的是证明按照关系线构建的数据库将具有现有数据库所具有的所有表达能力。现有的数据库通常处理拥有一组孩子的父母。例如,如果父数据项包含有关学生的数据,则每个孩子可能包含有关学生正在学习的一门课程的数据。

您实际上可以根据数学关系定义这样的结构,方法是允许关系的一个属性本身就是一个关系。我将称之为“嵌套”关系,虽然我不记得 Ed Codd 是怎么称呼它的。在定义与数学关系密切相关的关系数据模型时,Ed Codd 出于各种原因想要禁止这种结构。他的理由大多是实际的,让构建第一个关系数据库更加可行。

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

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

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

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

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

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

因此,您必须教新手为什么使用密钥访问所有数据是一件好事,这意味着您必须教他们 1NF 的真正含义。这就像教一个五岁的孩子一样难。新手通常不像五岁的孩子那么无知,但他们往往更固执。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 你说的在政治上(1) 是正确的,但你有信心这也能让他在考试中获得分数吗? (1)根据真实关系模型的政治。
    • @Erwin 一个好问题。我的答案可能不是考官想要的。我从未参加过这些供应商认证考试中的任何一项,而且我可能不会在这门考试中取得好成绩。
    【解决方案3】:

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

    例如。

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

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

    【讨论】:

    • @a_horse_with_no_name in 1NF 每列都应包含原子值,但我从未见过删除hobby_2 或电话号码第二列的要求
    • 那么,只需想象一列 hobby 与内容 'hiking,mountainbike'。它不是原子的,因此即使存在 PK 也不是 1NF。 “编号”列只是做同样事情的不同方式。
    • 在字符串中加入逗号不会使字符串不再是原子值。 1NF 与属性值的内容无关(更不用说属性的名称了);这纯粹是表结构的问题。
    • @sqlvogel:出于所有实际目的,存储分隔值被视为“单列中的多个值”。 技术上可能只是一个字符串,但从逻辑上讲,它们是多个值 - 而且 确实 违反了正常形式。这与“原子值”相同。 'Ford Prefect' 的值在逻辑上不是原子值,因为它由名字和姓氏组成,但对于数据库来说,它只是一个单字符文字。
    • 当然,如果这意味着您必须进行大量字符串操作才能从字符串中提取值,那么这样做通常不是一个好主意。但这不是 1NF 的意义所在。如果我将字符串存储在表中,然后明天我决定在其上使用 SUBSTRING 函数,这并不意味着表突然不再是 1NF。
    【解决方案4】:

    您只是引用了文本数据库管理基础的一部分。更完整的引用是:

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

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

    【讨论】:

    • 我最喜欢这个答案,因为它来自微软为 OP 正在努力进行的这个特定测试而认可的教科书。
    【解决方案5】:

    让我加入派对;)

    要让“1NF 中的这种关系”这个问题有意义,你首先需要一个关系。为了让你的表成为一个关系,你需要一个键。没有任何键的表不是关系。

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

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

    所以答案...

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

    ...是假的。你确实需要一个键,但你需要原子性。

    【讨论】:

      猜你喜欢
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2014-04-10
      • 2018-12-03
      • 1970-01-01
      • 2013-10-27
      相关资源
      最近更新 更多