【问题标题】:Does an empty SQL table have a superkey? Does every SQL table have one?空 SQL 表是否有超键?每个 SQL 表都有一个吗?
【发布时间】:2018-02-11 23:23:28
【问题描述】:

我知道超级键在 SQL 中的含义,但我有以下问题:

  1. 空 SQL 表是否总是有超级键?
  2. 是否每个 SQL 表都始终有一个超级键?

【问题讨论】:

  • 键不是记录的属性,而是表的属性。
  • SQL 不需要键,允许创建具有重复记录的表。
  • 请编辑您尝试在问题中使用的“超级键”的定义。 (对于 SQL 和/或关系模型。)也许你真的不想知道超级键,而是其他的东西;它可以帮助我们向您展示如何阅读/记住/编写/使用定义。
  • Superkey 是一个抽象概念。 SQL 只是一个实现。 IMO,您在这里混合了抽象层。

标签: sql database relational-database unique-key


【解决方案1】:

TL;DR“超级密钥”是一个RM (Relational Model of Data) 术语。 SQL 中没有标准用法。 SQL 表的超键可以合理地非正式地称为列集,您可以声明 primary keyunique not null,当表最多包含一行时可能加上 {}(尽管您不能声明它)。 “合理地非正式地”,因为 SQL 表不是 RM 关系。但是如果一个表不包含重复行和空值,那么我们可以合理地说它是一个关系,并且像每个关系一样,它有一个或多个超级键。 基本关系关系表达式的超键的定义考虑了它可以持有的所有可能值,因此它的当前值不会影响它的超键是什么。根据 superkey 的定义,在空关系 value 中,每个属性子集都是一个 superkey。

关系“超级键”

在数学中,“关系”的一个含义是一组类似表格的行状“元组”,它们是值的列表。它表示关系(船)/关联——在数学中也称为“关系”。这就是“RM”中的“R”的来源,也就是“关系数据库”一词的来源。 (Codd 1970) (Date 2015) 同样,“ERM”(实体-关系模型)来自“关系”作为关系/关联。 (Chen 1976) 在 RM 上下文中,“关系”也类似于表,但通常包含一组“元组”,它们是成对的“属性”名称和值的集合。 (或者它可能是数学关系或混合关系。)“超级键”有两种 RM 意义——关系值和关系变量或表达式。关系值的超键是一组属性,其中关系不包含具有该子元组的两行。关系变量或表达式的超键是一组属性,在每种情况/状态下,它都不包含带有该子元组的两行。因此,当变量可以保存的所有值都具有该超键时,该变量具有某个超键。

(在已出版的学术教科书中找到一个定义。请注意,当定义说名称的“forever”或“for all”值时,它们意味着当没有这样的值时满足这样的条件。类似地,当“for some" & "there exists(s)" 指的是命名值,它们并不意味着名称必须命名不同的值。)

一个空的恰好将每个属性子集都作为一个超键。 变量涉及变量的表达式的超键的定义考虑了它可以评估的所有可能值,因此它的当前值不会影响它的超键是什么。

每个关系都有一个或多个超键:一个关系包含一组元组,所以一个元组值最多出现一次,所以所有属性上的子元组的值最多出现一次,所以所有属性的集合是超级键。

SQL 与关系

SQL 表不是关系。它让人联想到允许重复和空值的数学和属性关系的混乱。所以 SQL 数据库被称为“关系型”,但它们很难体现 RM。

由于 SQL 表与关系的相似之处,涉及关系的术语被草率地应用于表。但是虽然你可以借用术语并赋予它们 SQL 含义——值、表、FD(函数依赖)、超键、CK(候选键)、PK(主键)、FK(外键)、连接、谓词、NF (范式)、规范化、1NF 等——你不能仅仅用这些 SQL 含义代替 RM 定义、定理或算法中的那些词,并得到一些合理或真实的东西。此外,RM 概念的 SQL 演示几乎从不实际上告诉您如何将 RM 概念正确地应用于 SQL 数据库。他们只是鹦鹉学舌 RM 演示文稿,不知道他们对术语的 SQL 含义的使用是否会使事情变得荒谬或无效。 (“几乎”,因为我希望有一些。)

如果您在某些 RM superkey definitions 中将“relation”替换为“table”(允许重复和/或空值),那么您将获得 SQL superkey 的定义作为满足primary keyunique not null 约束的列集。对于某些 other RM 超级键定义,当表最多包含一行时,您会得到这些集合加上 {}。 (因为它“识别”了任何行。)(您可能只会发现使用第二种风格的措辞的人,但认为它定义了第一种风格的措辞的作用。他们不会知道他们通过误解术语来滥用定义。)有些人可能只使用约束定义。您可能会发现这三个中的任何一个都使用了“UK”(唯一键)。

当一个表既不包含重复行也不包含空值时,我们可以将其解释为关系,将行作为元组,将列作为属性。那么我们可以合理地说表的超级键是关系的超级键。

"1NF" has no single meaning.“规范化”或“非规范化”或“UNF”或“0NF”或就此而言的“关系”。
What to do with null values when modeling and normalizing?

PS:“CK”不要将超级键与 CK 混淆。 CK 是一个不包含更小的超级密钥的超级密钥。 (因此,我们说 CK 是“最小”或“不可约”的超键。)关系可以有多个超键和 CK。 PK 是选择用来区分为 PK 的某个 CK。 SQL primary key & unique not null 声明我们可以称之为 SQL 超级键,但不一定是最小的,我们可以称之为 SQL CK。因此,当您在 SQL 上下文中听到“PK”时,您必须确定它是否意味着“通过primary key 声明的(SQL 超级键)列列表(可能是也可能不是 SQL CK)”和/或“可区分的 SQL 超级键(可能或者可能没有通过primary key) 声明”和/或“可区分的SQL CK(可能或可能没有通过primary key 声明)”。你总是必须问“key”是什么意思。通常,SQL 超级键——不管是什么意思。

PS:“Relation(ship)”弄清楚“relation”和“relationship”中的每一个是什么意思——关联?桌子? FK?在 RM 数据库中,每个关系值(变量或表达式的)represents a relation(ship)/association。但是“关系”(有时,“关系”)也(以一种根深蒂固的方式)用于 FK——不是在 RM 或 ERM 中,而是在 pseudo-RM & -ERM methods that misinterpret/misunderstand/misrepresent them 中,其根源早于它们。 (不幸的是,数据库行业的 RM 教育非常差。)FKs、PK、CK、超级键和other 约束是not needed to query & update。 (他们是为了诚信。)

【讨论】:

  • 这是一个奇怪的“关系”定义。在数据库中(问题是关于 SQL,换句话说:关系数据库),关系通常描​​述两个表是如何相关的。您的描述“当 SQL 表值没有重复的行 [...] 那么我们可以合理地将其称为关系”与普遍接受的定义非常不同,因此相当混乱。
  • 请参阅我经过全面翻新的答案。我希望它(更)清楚、简单、直接地解决 SQL 视图和术语,以及它们与原始 RM(关系模型)的连接、依赖和差异。如果您对 RM 内容有争议,我希望您关注这些链接并了解更多关于 RM 及其在 SQL DBMS 中的不良体现以及许多(非“面向事实”)信息建模和数据库设计方法的信息。
  • 这是一个非常彻底的解释。我必须承认,虽然我发现使用适当的主键和外键构建适当的规范化数据库很容易,但我对如何从 NF2 到 NF3、如何找到超级键和候选键以及所有这些的理论并不费心。对于实体(通常是表格)之间的关系,我也使用“关系”而不是“关系”,因为这与我们在英语中使用单词的方式更好地对应。这也是我对 ERM 一词的理解——实体之间的关系。很少有人会使用(令人困惑的)术语“关系”来表示表。
  • 我至少同意数学家使用“关系”作为关系/关联,由数学关系作为表表示。如果您阅读原始RM (Codd)ERM (Chen) 论文的早期部分,很明显关系=代表关系(船)/关联的表和关系(船) FK。这应该让您了解自 1970 年和 1976 年以来一直在广泛使用(和滥用)。您刚刚通过伪 ERM 学习。查看我的答案链接。
  • @ThorstenKettner,“在数据库中(问题是关于 SQL,换句话说:关系数据库),关系通常描​​述两个表是如何相关的。” ——这是不正确的。您描述的是表之间的“关系”。 “关系”是一个表,是数据库relational model 中的一个术语。 philipxy 使用正确。
【解决方案2】:

超级键只是唯一标识记录的列或列组。例如员工表中的员工编号。

  1. 当该表为空时(即尚未输入任何员工),该表的键仍然是员工编号。键是表的属性,与其中的记录无关。
  2. 在某些情况下,表没有超级键。这些情况很少见。大多数情况下,这些是列表,例如“员工在什么时间拨打了哪个号码”。您将存储员工编号、小时数和电话号码。如果员工在同一小时内两次拨打同一号码,则有两条相似的记录,因此没有唯一键。但是,大多数情况下,这种情况是可以避免的(在给出的示例中,我们可以将完整时间存储到秒甚至毫秒而不是小时,从而获得由员工编号和通话时间组成的唯一键)。

【讨论】:

  • @philipxy:我知道“superkey”是指数据库表的最小唯一键,即唯一标识数据库表中一行的键。我检查过的所有 Internet 站点都同意这个定义。也许你知道“超级键”这个词的意思是别的东西,关于关系的东西,但这不是当时的通用定义。我认为我的回答完全涵盖了这两个问题,而您只是在解释尚未被问到的事情时使事情复杂化。
  • 您的回答多次提到“超级键/列/组”,好像总是只有一个。 SQL 表只能有一个列的唯一情况是只有一列——超键的每个超集都是超键。请参阅我为表 vs 关系 vs 关系 vs FK 和 re SQL vs 关系编辑的答案。
【解决方案3】:

以下是 Ronald Fagin 1981 年的 A Normal Form for Relational Databases that Is Based on Domains and Keys(定义域键范式的论文,D.K.N.F.)中的一些精确定义:

  • 属性:一组X。 例如。 {城市,国家}。
  • X-tuple:域的函数集合属性X。 例如。 {(city, Paris), (country, France)}。
  • X-关系:一组X-元组。 例如。 {{(city, Paris), (country, France)}, {(city, Berlin), (country, Germany)}}。
  • X-约束:域X-关系集和codomain {0, 1} 的函数。对于将X-关系R映射到1的X-约束σ,则称R 服从 σ并且σ 持有R中。
  • 关系模式:第一个条目一组属性 X 和第二个条目一组 X-约束的元组。
  • 数据库模式:一组关系模式。
  • 关系模式实例:一个X-关系,具有属性并遵守关系模式的约束。
  • 功能依赖(FD)约束AB 其中A, BXX-关系 R 中成立,因此对于所有 t1t2R, (t1[A] = t2[A] ⇒ t1[B] = t2[B])。
  • 密钥依赖 (KD) 约束:KEY(A) 其中 AXX-关系 R 使得 AXR 中成立。 A 被称为关系模式(及其实例)的 superkey(当它不可约时也称为 key)键依赖约束 KEY(A)。
  1. 空 SQL 表是否总是有超级键?
  2. 是否每个 SQL 表都始终有一个超级键?
  1. 是的,因为空的 X-关系服从任何键依赖约束 KEY(A) 其中 A X.

    证明。 对于 {} 中的所有 t1t2,(t1[A] = t2[A] ⇒ t1[X] = t2[X]),相当于对所有t1, t2, (t1, {} 中的 t2 ⇒ (t1[A] = t2[A] ⇒ t1[X] = t2[X])),这是一个vacuous truth作为先行词 t1, t2 in {} 的第一个条件为假。

  2. 是的,因为每个 X-关系都遵循键依赖约束 KEY(X)。

    证明。RX-关系。对于R中的所有t1t2,(t1[X] = t2[X] ⇒ t1[X] = t2[X ])。

【讨论】:

  • 但是 SQL 没有关系,所以这并不(直接)适用于 SQL。 PS这篇论文的解释不是很独立和清晰。 PS无论如何,数据库关系有很多变化。这个问题并不清楚“表”是指值还是变量。 (释义虽然区分了关系值和模式,但只讨论值,而不是变量。但是我们使用变量和模式来处理变量。论文介绍了适用于后来变量的概念:“如果有一个有效的实例[模式] R*"的R。)
  • "超键是键依赖约束。"不,超级键是纸/释义键,即 KEY 持有的属性集。 (所以你的 1 和 2 不回答(关系版本的)(不清楚的)问题。)
  • @philipxy “不,超级键是纸/释义键,即 KEY 持有的属性集。”发现得好。我刚刚用我忽略的 Fagin 文章的正确定义更新了答案(尽管他使用名称 key 来表示可约和不可约超级键)。
  • @philipxy “释义,尽管它区分了关系值和模式,但只讨论了值,而不是变量。” Fagin 定义了关系模式和关系实例的键(参见我的答案中更新的定义),所以我认为我们不需要引入 Date 的 关系变量
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多