我最近一直在复习 Codd 的关系代数和关系数据库。我记得关系是一组有序元组,而函数是满足域中每个点必须映射到 codomain 中的单个点的附加属性的关系。从这个意义上说,每个表都定义了一个从主键到由所有其他列定义的余域空间的有限点函数。这是关系的意义吗?如果是这样,为什么关系代数不是函数代数,为什么不把它称为函数数据库呢?
谢谢。顺便说一句,对不起,如果这不是 stackoverflow 的正常形式(哈哈,数据库笑话!)但我查看了所有论坛,这似乎是最好的。
我最近一直在复习 Codd 的关系代数和关系数据库。我记得关系是一组有序元组,而函数是满足域中每个点必须映射到 codomain 中的单个点的附加属性的关系。从这个意义上说,每个表都定义了一个从主键到由所有其他列定义的余域空间的有限点函数。这是关系的意义吗?如果是这样,为什么关系代数不是函数代数,为什么不把它称为函数数据库呢?
谢谢。顺便说一句,对不起,如果这不是 stackoverflow 的正常形式(哈哈,数据库笑话!)但我查看了所有论坛,这似乎是最好的。
嗯,有 CJ Date 的“数据库系统简介”和 H. Darwen 的“关系数据库理论简介”。这两本书都是很好的书,我强烈建议阅读它们。
现在到实际的问题。在数学中,如果你有n 个集合 A1, A2, ..., An,你可以形成它们的笛卡尔积A1 x A2 x ... x An,它是所有可能的 n 元组 (a1, a2, . .., an),其中 ai 是 Ai 中的一个元素。根据定义,n 元关系R 是 n 个集合的笛卡尔积的子集。
函数是二元关系——它们是 Dom x Cod 的子集。但是与更高的arity有关系。例如,如果我们取集合 Humans x Humans x Humans,我们可以通过取所有元组 (x, y, z) 来定义一个关系 R,其中 x 和 y 是 z 的父母。
现在有一个来自逻辑的重要概念:谓词。谓词是从笛卡尔集合 A1 x A2 x ... x An 到语句集的映射。让我们看一下谓词 P(x,y,z) = "x and y are parents of z"。对于来自 Humans x Humans x Humans 的每个元组 (x,y,z),我们从中获得一个陈述,对或错。给我们真实陈述的所有元组的集合,谓词的真值集,是……一个关系!
请注意,我们实际上只需要使用一个谓词来设置一个真值集。因此,当我们为企业建模时,我们发明了一堆描述它的谓词,并将它们的真值集存储在关系数据库中。
因此,每个有关系的操作都有一个对应的谓词操作,所以当我们取关系、连接、投影和过滤它们时,我们最终会得到一个新的关系——我们知道谓词的真值集是什么:我们只取对应的谓词和它们,并与存在量词绑定,我们得到一个新的谓词,我们知道它的真值集。
编辑:现在,我必须注意,由于关系是一个集合,它的元组是没有顺序的。因此,表只是关系的模型:您可以使用不同的表来表示相同的关系。此外,在关系理论中习惯于使用更一般定义的元组和笛卡尔积。我将更高的元组定义为 (a1, a2, ..., an) — 基本上,一个从 {1,2,...,n} 到 A1 U A2 U ... U An 的函数(其中我的图像必须是在艾)。在关系理论中,我们将一个元组作为一个函数,从 { name, name', ..., name } 到 A1 U A2 U ... U An - 所以,它变成了一条记录,一个带有命名组件的元组。当然,这意味着记录的组件是无序的:(x: 1, y: 2),一个从 { "x", "y" } 到 N 的函数,它映射 x 到 1 和 y 到 2,是相同的元组/记录为(y:2,x:1)。
所以,如果你拿一张表,交换行,交换列(带有它们的标题!),你最终会得到一个新的表,它代表相同的关系。
这个 Wikipedia 页面详细介绍了该模型背后的基本原理。从概念上讲,密钥只是访问给定元组的一种方式,而不是元组本身的一部分——另见Codd 的 12 条规则,#2。