第一个范式:确定性定义


9

我试图得到什么是第一范式的确定版本。我阅读的所有内容都有一个稍微不同的旋转。

许多机构(例如Date)说,根据定义,关系始终是“第一范式”,而其他机构则列出了要求列表。这意味着对1NF的需求从零到很多。

我猜想区别在于表和关系之间的关系:表可能是一个完整的混乱,而关系则受到某些限制。关系在SQL中表示为表的事实因此造成了一些混乱。

我特别关注与SQL数据库有关的1NF。问题是:要确保表格采用第一范式需要哪些属性?


许多权威人士建议,如果表表示一个关系,则该表已经存在于1NF中。这将1NF的定义推回到关系的定义。

以下是1NF中表格的一些属性:

  • 列顺序微不足道[1]
  • 行顺序微不足道
  • 所有行的长度相同(即,行数据与列标题匹配)
  • 没有重复的行(可以使用代理主键来保证,但是PK本身不是必需的)
  • 没有重复的列
  • 每一列包含一个单一值(原子)

[1]从技术上讲,属性是无序的,但是在表中,行数据的顺序必须与列标题的顺序相同。但是,实际顺序并不重要。

多个数据上

原子数据的概念是不能进一步分解项目。此概念已经过资格验证,尽管从技术上讲,所有内容都可以细分为恶心,但实际上,取决于所使用的数据的方式,所讨论的数据无法进一步细分。

例如,完整的地址或全名通常应进一步细分,但是诸如给定名称或城镇名称之类的组件可能不应进一步细分,尽管事实上它们可以是字符串。

至于重复的列,它是一个设计不良列具有重复列,例如phone1phone2等。通常,重复数据指示用于一个附加的相关表的需要。

依存关系

行之间不应有任何关系,除非它们符合相同的标题。

列之间也应该没有关系,但是我认为这是较高范式的主题。

问题是:上面的多少在1NF的定义中?独立行位也进入其中吗?

Answers:


7

初步

范式的定义(根据1971年“数据库关系模型的进一步规范化”的介绍被称为第一范式)和关系范式定义本身在1970年发表在科学论文中,数据库管理,即实践的基础上,“数据的关系模型的大型共享数据银行”通过创建(RM为了简洁)EF科德博士,谁是图灵奖的获得者,并关于关系框架的权力。

是的,对Codd博士的著作有很多解释,解释,论述,偏离和意见,但是我个人更喜欢坚持原始出处,我强烈建议您自己进行分析,以便得出自己的结论。

我当然不完全理解RM,但是我对RM的了解使我赞赏其卓越性,远见,意图和范围,尽管几十年后人们可以注意到它有一些轻微的错误,但并没有减少,无论如何,它的天才和优雅。在其领域中,RM以独特的方式经受住了时间的考验,并且无与伦比。

强调上述不精确性的举动是(使用慈善用语)不公平,因为从相当远的距离来看,这种开创性的材料需要进行一些改进和扩展,是的,但是作品的主体是坚如磐石的。非常有构想(实际上,科德博士自己做了大部分(即使不是全部)这样的改进和扩展)。

我继续不断地重新阅读RM,以增强对这种特殊知识来源的理解(并且我对每一次重新阅读的理解都在不断增长);目的是站在巨人的肩膀上。

关系表

重要的是要注意,由于关系是抽象资源,因此Codd博士设想了以表格形式表示关系的实用性(他最初使用术语“数组表示”,但随后使用“表”或“ r表”),因此关系数据库(RDB)的用户,设计者和管理员可以以更加熟悉或具体的方式与他们联系。因此,在RDB实现的上下文中,使用作为关系的简写是有效的,只要上述表格代表实际关系即可。此功能非常明显-尽管很明显-因为在评估表是否表示符合第一范式(1NF)的关系之前,它必须准确表示一个关系。

RM自然包含表必须确定的属性,表实际上是否要描述关系,但在此我将对它们进行非正式且朴实的解释(另一种,是的!):

  • 它必须有一个名称(数据库结构中的每个特定关系都必须与其余名称区分开)。
  • 它的每一行都必须精确描述相关关系的一个元组
  • 其行的顺序根本不重要。
  • 它的每个必须具有一个名称,该名称代表所关注关系的确切一个的含义,并且所述名称必须与表的其余列的名称不同(一列必须唯一区分并且必须带有具有独特的含义,是的,数据库建模人员和业务专家在准确定义每个重要领域中所扮演的角色至关重要)
  • 其列的顺序没有任何意义。
  • 其所有行的列数必须相同。
  • 它必须至少具有一列或列的一种组合,以唯一地标识通过行描述的每个元组;这样,所有行都必须是不同的(是的,这强调了声明至少一个KEY的重要性,并且当有两个或多个KEY时,应根据实际原因将一个定义为PRIMARY,而其余的可以是被视为ALTERNATE;但是,是的,在做出决定之前,每个KEY都是“ PRIMARY”定义的“候选”。

拥有一个实际上代表一个关系的表是至关重要的,因为当它经历一种关系类型的操作时,结果又是一个代表关系的表。以这种方式,所述表的行为是可预测的

原子域(列)

在RM的第一部分中,Codd博士介绍了几个关系样本,以介绍一些概念。因此,为了理解原子域的含义,让我们从RM的以下摘录开始,其中摘录了一些相关点:

到目前为止,我们已经讨论了在简单域上定义的关系的示例,这些域的元素是原子(不可分解)值。非原子值可以在关系框架内讨论。因此,某些领域可能具有关系作为元素。这些关系又可以在非简单域上定义,依此类推。

通过这种方式,可以说每个上述说明关系都适合两种,例如AB

  • 种类A仅将由域(列)构成的关系(表)分组,该域(列)在其每个元组(行)中仅包含简单值,即,此类域(列)不包含关系(表)作为值,其中此上下文意味着值是原子性的,因为它们无法连续分解为新的关系(表)。因此,此类关系是已归一化的关系,即它们符合1NF,其形式是可取的。

  • 类型B仅由关系(表)集成,该关系(表)具有一个或多个域(列),这些域在每个元组(行)中将关系作为值保存,并且表示所述值是非原子的,因为它们随后可以分解为新的关系(表格),即它们是可分解的。因此,这种关系是不规范的,即它们侵犯了1NF,处于不受欢迎的形式。

正常化

Codd博士在下面的段落中介绍了RM中有关规范化的部分:

可以通过上述类型的二维列均匀数组在存储中表示其域都非常简单的关系。与一个或多个非简单域的关系需要一些更复杂的数据结构。由于这个原因(以及下面要引用的其他原因),消除非简单域的可能性似乎值得研究!实际上,有一个非常简单的消除过程,我们称之为标准化。

然后他继续显示:

  1. 一组非标准化的关系(它的域包含关系作为值,即它们是非原子的;即它们不是简单的)

  2. 一组规范化的关系(即,已分解的关系;即,将关系重视的域分解为表示它们是原子的简单关系的域)

然后他描述了从非规范化关系中获得规范化关系的过程。

在这方面,他用来说明规范化练习和练习说明本身的关系非常清楚,我再次建议您自己分析它们(并且我也希望这会鼓励一些读者阅读本书)。

他成功地指出:

标准化类型的进一步操作是可能的。本文不讨论这些。

而且,上述操作(即第二和第三范式(2NF和3NF))实际上在“数据库关系模型的进一步规范化”中进行了详细介绍,并且如上所述,在本文​​进行介绍(以及以后的印刷和出版)之后, ,原始范式被称为第一范式。

正如从业人员可以看到的那样,具有非规范化的关系(表)将(几乎总是不必要的)卷积引入RDB实现中。

满足1NF的关系简化了约束和数据操作的定义,可以通过数据子语言来实现,这种数据子语言比未规范化的关系(表)所需的复杂程度要低,正如Codd博士在以下几行中指出的那样:

如上所述,采用数据的关系模型允许基于所应用的谓词演算来开发通用数据子语言。如果关系的集合为正常形式,则一阶谓词演算就足够了。这种语言将为所有其他拟议的数据语言提供语言能力的标准,并且本身将是嵌入(以适当的语法修改)各种宿主语言(编程,命令或问题导向)的强大候选者。[…]

[…]

数据子语言的普遍性在于其描述能力(而不是其计算能力)。

迷惑

从我的观点来看,困惑出现了,由于(a)中上述的过量的解释,解释等等,关于1NF和所述 RM本身,因为(b)的进一步尝试重新定义 1NF该状态具有关系如果域的值对应于每个元组,则这些域的值又是符合 1NF的关系。

我对你的其他观点

行之间不应有任何关系,除非它们符合相同的标题。

我不确定我是否正确理解了该语句的意图,但是除了要遵循相同的标头之外,关系(表)的(元组)行之间必须存在连接,因为它们中的每一行都应该是关于关系(表)应该表示的特定实体类型(根据感兴趣的业务上下文定义)的特定出现。

列之间也应该没有关系,但是我认为这是较高范式的主题。

我也不知道我是否正确地解释了该陈述的含义,但实际上,根据我对前一个方面的回答,关系(表)的域(列)之间也必须存在关系,这就是为什么它是一个关系关系模型和RDB具体实现的基本结构)的原因。

为了举例说明,关于假设关系(表)

  • Salary (PersonNumber, EffectiveDate, Amount)

元组(行)

  • Salary (x, y, z)

会传达意思

  • The Salary payed to the Person identified by PersonNumber x, on EffectiveDate y corresponds to the Amount of z

因此,Salary关系(表)的每个元组(行)必须适合上述断言的结构,并且不同之处在于将替换相关域(列)值,但是(a)之间必须存在关系所有Salary域(列)以及(b)每个元组(行)的所有对应值之间;这样的关系是必不可少的。

较高范式(2NF和3NF)可用于消除关系(表)的域(列)之间的功能依赖性,它们有助于避免域(列)之间的不良 连接,因为所述不良连接允许引入更新异常。2NF和3NF都有助于在某些RDB实现中测试关系(表)结构的合理性。


3

插图 取一个包含典型美国地址的文本字符串:

"123 Cornhusk Rd., South Succotash, NY 12345"

编写查询以查找所有Cornhusk Road居民或South Succotash镇或纽约州的特定居民将是一项艰巨的任务。特别是在数据中包含以下字符串时:

"123 Cornhusk Road, South Succotash, NY 12345"
"123 Cornhusk Rd., South Succotash, New York 12345"
"123 Cornhusk, South Succotash, NY 12345"
"123 Cornhusk Rd., SOUTH SUCCOTASH, NY 12345"

它们每个都指定相同的实际地址(并且甚至不考虑“ Succatash”之类的可能的拼写错误),但是编写算法以成功比较它们是我不想在地球上剩下的最后几年要做的事情。

输入第一个范式。我不会详细介绍它的完成方式,仅考虑大多数数据库中常见的形式:

create table Addresses(
  ...
  Street  varchar,
  City    int        references Cities( ID ),
  State   char( 2 )  references States( ID ),
  Zip     int
  ...
);

这不是完整的规范化。例如,您可以将Street进一步划分为StreetNum和StreetName,但这仅够一个简单的说明,实际上就可以在现实生活中进行标准化过程了。找到所有Cornhusk Road的居民仍然有一个小问题,但是如果您在Street上搜索子串“ Cornhusk”,并且碰巧在某个地方有一个名为Cornhusk的小镇,至少不会造成混乱。

Date等人提供的定义的问题在于,它们无法查看数据内部并考虑该数据的含义。不是我特别责怪他们,这可能很难。

因此,我们必须采用“字符串”并将其转换为“地址”。但是想出一个包罗万象的地址定义并不像看起来那么简单。特别是在多个国家/地区使用地址时。

首先,我们修复上下文。没有上下文,没有任何意义。我们的上下文是地址。在这种情况下,我们可以看到具有特定含义的数据部分,例如StreetCity等。我们为每个含义分配一个单独的字段。

困难的部分是,数据(如单词)对于不同的人可能具有不同的含义,或者某些人可以看到其他人没有的含义。它本身可以是一个项目,需要大量的合作努力。但这是良好数据库设计中的关键要素。

标准化的目的是消除或至少最小化异常数据。考虑以下事实:在上表中,可能输入了在所选状态下不存在的城镇或邮政编码。或者输入的街道在所选城镇中实际上不存在。嗯,但是现在我们进入第二和第三范式,这是另一个话题。


1

将1NF视为关系的数学概念的介绍,而不是特定的数据结构或固定的规则集。关系之类的数学结构可以用不同的方式表示-表只是最方便的方式之一。使用表时,存在一些限制以确保它们清楚地表示其预期的关系,并且对表表示的关系在逻辑上是合理的。

当我们说列和行的顺序和重复无关紧要时,这是为了确保所有重要信息都被记录为表中的值并且可供我们的查询访问,并且不会被编码到表的表示中。尽管很少(如果有的话)的作者明确禁止在表中使用颜色,但了解上述限制的目的将导致我们类似地排除使用有意义的表示色,从而必须明确记录重要的颜色值。Date和其他作者出于相同的原因也弃用了隐藏的行标识符。

原子性的概念是关于确保所有重要结构均表示为关系,以便我们能够分析所有数据中的依存关系并防止出现异常,从而使所有有意义的结构可被关系操作统一访问。复合值不是无效的,但是它们需要特定于域的运算符来解包,这增加了复杂性,并且它们可以引入冗余。当然,在实践中,一些简单的复合类型和关联的运算符很方便,并且有助于提高查询的紧凑性和表示性,但这并不与理论相矛盾。

行依赖项(如多值依赖项)不会违反1NF,但像列间的依赖项一样,是较高范式的主题。即使重复的列phone1phone2,,等)设计不佳,也不会违反1NF。


0

WikiPedia关于1NF 的定义和解释,我认为是相当不错的。- 乔阿诺洛

在Wikipedia文章中扩展一个句子:

视为电话号码,文字不是原子的

这可以使您理解为何会有如此多的困惑。如果这只是一小段文字,那么它是原子的。但是,如果将其视为电话号码,则不是原子的。Date和其他人回避了此问题。它与数据的含义有关。在分析主题时,您必须应对数据的含义。

是否有进一步分解的意义与是否满足第一个范式的问题有关。1NF背后的意义是提供对所有数据的键控访问。但是,如果您通过键控访问检索到的东西具有子结构,则您就没有对子结构的键控访问。- 沃尔特·米蒂

“ 1NF”用于表示许多不同的事物,其中许多同时是荒谬的和常见的。请参阅我对“数据库管理系统中的规范化”的回答,包括其链接。其中之一是我对“ dbms中的原子性是什么”的回答。(两者都在堆栈溢出处。)- philipxy


根据问题的评论创建的社区Wiki答案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.