今天,我们来讨论原子性。
原子性的要求前面已经说过了,单个属性单个值。这里单个值并不是要求为基本数据类型,在设计层面,基本数据类型和各种自定义类是平等的。
作者对此的解释为,对属性值的使用是将属性值作为一个整体使用,而不取其分量。比如一个坐标对象,如果总是传输整个坐标,比较两个坐标是否相同或计算其距离,则一个坐标对象就有原子性;如果经常存取它的x或者y分量,那么这个坐标对象就不具有原子性,应该将x和y分作两个属性。当然这个也不是绝对的,因为分量操作可以看作是用一个函数操作整体的坐标对象。
此外,作者还讨论了多值属性的情形。多值属性的三种实现形式:多值类,分列存储,属性对象。多值类方案与上一段的分量情形类似,其原子性是需要商榷的。分列存储方案欲严格满足原子性,要求分列数量确定,且列之间不可交换信息(两个列表示同一个含义,值可以相互复制,作为一个表看着也不合理嘛),详细见后。属性对象方案是将多值属性处理成多对多关系(一个属性值可能多个对象都拥有不是么),这个方案很好地保证了原子性。
分列存储方案,举个例子,对多个电话号码的管理。一个人可能有住宅固话、办公固话、手机等电话号码。采用分列存储方案,如果分成住宅固话、办公固话、手机三列,那么没有明显问题;如果分成号码1、号码2、号码3三列,那么问题很明显,号码1、2、3的顺序是否重要,删除号码1之后号码2、3是否需要位移,比较两人是否有相同电话号码时会不会发生跨列比较(其实住宅固话、办公固话、手机划分方法也存在此问题)。至于万一某人有第四个号码或者住宅、办公、手机之外的号码种类这种问题,在分列存储方案里提都不要提。你会发现,除了第四个号码这一点外,多值类方案也会面临这种问题,只不过把这些问题的处理封装到类中,不在数据库里表现。
事实上,原子性这一条,有很大的抽象概念性和相对性,偶还是抽空看看SQL国际标准吧。在软件实现方面绕开规则判断建立数据库是可以的,但是使用这样的数据库时可能带来很复杂的编程。它指导着我们认真进行需求分析和扩展性等多方面的考虑。