知识卡片

数据值原子性没有绝对含义

普通读书笔记卡

内容

第一范式(1NF)要求每个关系的每个元组在每个属性位置只包含一个”原子的”单一值, 但”原子”到底是什么意思其实没有一个绝对答案——字符串明明可以被LIKE、SUBSTR、|| 这类运算符继续拆分,位串、有理数(可拆成整数和小数部分)、日期时间(可拆成年 月日时分秒)的原子性同样都是开放问题。书中用一个反直觉的例子说明这一点:一个 属性如果取值是一般集合(比如某供应商供应的零件编号集合{P2,P4,P5}),大多数人会 说这不符合1NF,因为它看起来像被明令禁止的”重复组”;但如果把这个集合值形式化地 包在大括号里当作一个整体,它和字符串在可分解性上其实没有本质区别——字符串也有 内部结构,只是通常被当作整体处理。真正的结论是:原子性概念不是绝对的,而是取决 于当下要在哪个抽象层次处理数据——有时把一个零件编号集合当作单一事物整体处理, 有时又要下沉到集合内部逐个处理零件编号,这只是抽象层级的切换,不是原子性本身的 客观属性。这个洞察进一步引出关系值属性(RVA,relation valued attribute)的概念: 比起用一般集合表示这类”组合值”,用关系来表示更好,因为这样可以直接复用整套现成 的关系代数运算符(选择/投影/连接),而不需要为集合单独发明一套并/交等新运算符; SQL不支持RVA(严格意义上的表值列),但支持数组列、多行列(多重集/包,即允许 重复的”类集合”结构)作为近似替代。

参考来源

- 位置:《SQL与关系数据库理论——如何编写健壮的SQL代码》第2章"类型和域"2.3节 "数据值原子性"(源文件:OEBPS/text00021.html) - 结论依据:原文明确"原子性概念并不是绝对的;它依赖于我们到底要怎样处理数据。 有时,我们要将一个零件编号集合的整体作为一个事物来处理;有时我们又要将集合中 的各个零件编号分别处理……如果字符串符合1NF的要求(即字符串是原子的),那么 集合也必须是符合的""图2.2中的PNO_REL属性是一个关系值属性(RVA)……SQL并不 支持RVA"。 - 原始内容:原子性概念并不是绝对的;它依赖于我们到底要怎样处理数据……如果字符串 符合1NF的要求(即字符串是原子的),那么集合也必须是符合的……SQL并不支持RVA。