知识卡片
数据值原子性没有绝对含义
内容
第一范式(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。