知识卡片

元组的精确定义与"元组从不包含NULL"的推论

普通读书笔记卡

内容

元组的形式化定义是:给定n个(可以重名的)类型T1到Tn,每个类型对应一个互不相同的 属性名Ai,每个属性关联一个该类型的属性值vi,n个”属性名/值”配对(分量)构成的集合 就是一个涵盖这n个属性的元组,n是元组的度(degree,度为1叫一元、2叫二元……), n个属性构成的集合是元组的标题。这个定义带来一条重要但容易被忽视的推论:从来没有 任何元组能够包含NULL——因为按定义,元组的每个属性位置必须关联”某种相应类型的 值”,而[[实体完整性与参照完整性及NULL的本质]]中已明确NULL不是值,只是”值未知”的 一个标记;既然元组不能包含NULL,由元组集合构成主体的关系自然也不可能包含NULL, 这构成了反对”NULL属于关系模型”这一立场的一条正式(而非仅凭个人偏好)的理由。由此 也引出一条用词建议:既然”null值”这个说法在术语上自相矛盾(null根本不是值),应该 只说”null”,不说”null值”——这不是咬文嚼字,而是关乎能否正确思考这个问题;书中 指出SQL标准自己的定义就自相矛盾(”null值是一个特殊的值,用于表明数据值的缺失”), 这正是SQL处理NULL屡屡出错的根源之一。定义的另一条推论是:元组的每个子集仍是 元组,标题的每个子集仍是标题;空集是任何集合的子集,因此”标题为空、分量集合为 空”的0-元组(度为0,类型TUPLE{})也是合法元组,且看似无用,实则在[[TABLE_DUM 与TABLE_DEE关系代数中的0]]中扮演关键角色。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第3章"元组、关系、行、表" 3.1节"元组是什么"(源文件:OEBPS/text00031.html) - 结论依据:原文明确"依此定义的所有n个分量的集合(设为t),即是涵盖属性A1, A2,…,An的一个元组值……从来就没有元组包含null。这是因为,根据定义,每个 元组都对它的每个属性包含一个(某种相应类型的)值,而null不是值……因为'null值' 一词作为术语自相矛盾,所以别用它;说'null'就行"。 - 原始内容:从来就没有元组包含null。这是因为,根据定义,每个元组都对它的每个 属性包含一个(某种相应类型的)值,而null不是值……因为"null值"一词作为术语 自相矛盾,所以别用它;说"null"就行。