空值情况下的函数依赖

Functional dependencies in case of nulls

假设我们有一个包含 3 列 A、B 和 C 的 table

A      B      C
---------------
1      2      3
2      4      5
4      6      7
n      5      n

这里'n'表示null。

我们可以说 A -> B 和 A -> C 吗?我知道函数依赖的定义,但我只是对空值感到困惑。

如果null被认为是一个值,那么答案是肯定的。 A -> B, C 保存在给定的数据中。但是,要成为一个值,需要满足某些要求。适用于域(例如整数)的所有运算符,如相等、加法、小于等,必须在存在空值的情况下明确定义。

如果 null 不是一个值,那么答案就更复杂了。严格来说,函数依赖适用于关系。如果一个table表示一个关系,那么我们可以引用table中的函数依赖。但是,表示值缺失的符号是元数据,而不是数据。它允许多个联合不兼容关系由单个 table 表示。在这种情况下,我们不能将函数依赖的概念应用于 table,因为不清楚我们在谈论哪种关系。

更令人困惑的是,SQL DBMS 无法始终如一地处理空值。在某些情况下,它们像值一样处理,而在其他情况下则像值的缺失一样处理。如果你想从逻辑上理解和描述一个table,最好的选择是将它分解成一组无空关系,然后分别分析这些部分。

对于您的示例 table,如果 null 不是值,我们 运行 就会遇到问题。最后一行没有唯一标识符(它不能是 B:4,因为另一行也有 B:4),并且由于缺乏信息我们无法确定任何内容。如果不丢弃该行,则无法将该示例分解为一组关系。

如果我们将最后一行更改为 B:5,那么我们将其分解为两个关系:R1 = {(A:1, B:2, C:3), (A:2, B:4, C:5), (A:4, B:6, C:7)}R2 = {(B:2), (B:4), (B:6), (B:5)}。我们可以说 A -> B, C 在 R1 中成立但在 R2 中不成立。