完全外连接产生的关系的键

Joh*_*ohn 5 join relational-theory

完全外连接产生的关系的键是什么?如果没有key,怎么说关系代数在它的算子下是封闭的,每个算子的结果也是一个关系?

Tod*_*ett 5

简答

关系代数中的闭包与键的概念无关。只要关系具有以下属性,关系变量就会保持关系:

  • 元组没有排序- 顺序没有隐含意义
  • 元组是不同的- 没有重复
  • 属性没有排序- 顺序没有隐含意义
  • 属性是单值的- 任何类型都只有一个

关系代数的基本算子确实是封闭的,因此当应用于关系时总是产生关系。键是不相关的,因为根据定义,每个关系都没有重复的元组。根据定义,任何会导致重复元组(例如单个属性在关系上的投影)的操作在提供结果时都会消除这些重复元组。如您所知,SQL 没有正确实现这一点。

长答案

为了真正理解简短的答案,并理解“外连接”带来的额外细微差别,我们需要深入研究数代数中关系代数的基础。

数代数

代数是谷歌定义的“数学的一部分,其中字母和其他通用符号用于表示公式和方程中的数字和数量”。一个代数属性operation,这意味着有一些动作可以改变数字。对于数字,这些是加法、减法、乘法、除法、乘方和求根。还有许多其他代数属性,例如关联属性,它指出您可以以任何方式对数字进行分组,而不会更改运算结果。这些性质赋予代数独特的力量,因为有了这些性质,我们可以使用字母来表示数字,通过方程中定义的运算符来操作它们,并且知道无论最终用什么实际数字代替字母,转换都将是绝对正确的。

闭包是另一个代数属性,它指出如果一个操作数字的运算符总是产生数字,那么数字在该操作下是闭合的。例如,我们知道的实数在加法下是封闭的。将任意两个实数相加,结果将始终是实数。实数在平方根运算下封闭,因为 -1 的平方根不是实数。所有这些都直接来自Math Forum @ Drexel的财产词汇表

关系代数

Chris Date 说 Ted Codd 是个天才。Codd 的独特天才在于认识到数学关系与集合论和逻辑相结合,在应用于数据管理时非常实用。Fabian Pascal 的实用数据库基础系列提供了一个很好的解释为什么会这样,我将简要回顾他的一些见解。

1960 年代的主要数据库问题之一是,必须为您想要向管理数据的 DBMS 提出的每个“问题”编写程序。Codd 表明,通过采用关系的概念并将其应用于数据库,可以开发出与数据物理存储方式完全不同的数据输入和输出逻辑模型。该逻辑模型的一部分是适用于关系的一组运算符——关系代数。就像数字代数允许我们利用代数性质来处理大量复杂的方程,其中字母代表任何潜在的数字并保证正确的结果,关系代数可以对关系做同样的事情。

为什么这很重要?因为对于代数,运算及其结果并不取决于关系及其属性的实际含义。然后,通过调整逻辑,就像代数一样禁止有效形式,无论命题什么,都可以用来评估参数是真还是假,可以实现通用查询语言,使 DBMS 的用户能够询问真数据问题 - 任意复杂性之一 - 可以使用关系代数规则对 DBMS 进行编程,以给出可证明的正确答案!

现在就像数字代数一样,闭包是赋予代数力量的基本性质。关系在基本运算符下是封闭的,因此您可以随意以任何顺序任意嵌套这些操作,以声明您能想到的几乎任何“问题”。一旦创建了实现关系代数的 DBMS,就不再需要编写独特的程序来找到每个问题的答案。DBMS 用户只需使用关系代数声明问题。

外连接

到目前为止,我一直在说基本运算符。那是因为该理论没有考虑缺失的数据。根据定义,每个关系都包含具有每个属性值的元组。但是为了使数学适应缺失数据的实际现实,必须针对属性值未知时开发一些解决方案。SQL 实现了 NULL 和 3VL。Codd后来提出了marks 和4VL。必须扩展连接运算符以保留不匹配的元组,并且 SQL 通过为不匹配的元组的属性生成 NULL 而不是值来实现扩展。日期显示通过执行此外连接是:

一种霰弹枪联姻:它迫使表成为一种联合——是的,我的意思是联合,而不是加入——即使有问题的表不符合联合的通常要求(见第 6 章)。实际上,它通过在进行联合之前用空值填充一个或两个表来实现这一点,从而使它们毕竟符合那些通常的要求。但是没有理由不应该使用正确的值而不是空值来完成填充。(日期,CJ (2011-12-16)。SQL 和关系理论:如何编写准确的 SQL 代码(Kindle 位置 2601-2602。O'Reilly Media。Kindle 版。)

结论

那么在外连接(全连接、左连接或右连接)的操作下关系是否关闭?我想这取决于该运算符的实现方式。如果您确实认为一个关系仍然是一个关系,即使带有未匹配元组属性的缺失值的标记,我会说是。或者,如果您认为关系仍然是关系,即使带有缺失值的标记,但可以用默认值替换缺失的属性值。但是,如果您认为一个关系仍然是一个关系,即使有缺失值的标记,并且您的 DBMS 实现了 SQL NULL,并且您不能或不替换外连接中 SQL 提供的 NULL 的值,那么,关系是在该外部连接下关闭。两个关系进去了,但是一个关系没有出来。