因就是:错误地把对象属性当作对象标识!
对象属性和对象标识都是对象数据库中的概念。
什么是对象属性呢?
就是业务逻辑上涉及的任何可变信息,什么“姓名”、“性别”、“身份证号”、“订单号”通通都是对象属性。对象属性总会变化的,只是有些变得快,有些变得慢而已。
对象标识是啥?就是唯一区分数据对象的鉴别符,对象标识存在的唯一目的就是区分对象,除此之外没有任何业务逻辑上的意义。
不管王菲的属性值怎样变化,但王菲还是王菲,不是二班的那个“王菲”。也就是说,王菲的灵魂未变,她是不会改变的,就象哲学上所说的“不以人的意志为转移”。这种唯一表示对象本身的东西,就是对象标识!
对象标识是唯一的。也就是说,即使两个对象,他们的属性完全一样,但它们的对象标识是不同的。毕竟,同名同姓甚至同一天出生的大王菲和小王菲是两个不同的人。
对象的标识是永恒不变的。一旦对象产生,它的标识就自然地、唯一地产生了。尽管王菲换了名,身份证号也变过,但王菲的对象标识未变。即使到了下个世纪,她的对象标识也将依然存在于歌迷们的们的心中。
对象的标识是描述关系的基础。王菲唱的歌是王菲唱的,不是初二二班的那个“王菲”唱的。王靖雯唱的歌就是王菲唱的歌,有的歌迷只将歌曲和歌手的人名关联起来,难怪会出混乱。香港政府也犯相同的错误,将王菲的身份证号码这一内部属性,跟那个弹电吉他的小子关联起来,也许就是命运的错误。
那么,我们在设计数据库结构时,到底该用什么来做主键呢?
对象数据库说,主键只能是对象标识!
至于对象属性是否唯一,那是由业务逻辑所决定的。如果业务逻辑规定订单号不能唯一,就为订单号建一个唯一索引好了,但它不是主键。
所以,当我们看到有些数据库设计采用了额外的一个字段来专门充当主键,并用这个主键与其他表关联的话,那就是已经走到对象数据库的门口了。什么“内部码”,“流水号”,“序列号”,“自增数”通通都可以算是对象标识。
为什么SQL Server要提供自增量字段以及GUID的标识字段呢?都是为了这专门的主键字段服务的。
如果我们打算向对象数据库路上走得话,就请使用对象标识来做专门的主键字段吧。
当然,怎样产生唯一的对象标识来做主键,这也是有说道的。
1.用自增量字段
自增量字段每次都会按顺序递增,可以保证在一个表里的主键不重复。除非超出了自增字段类型的最大值并从头递增,但这几乎不可能。使用自增量字段来做主键是非常简单的,一般只需在建表时声明自增属性即可。
自增量字段的长度可以很短,比如使用一个int类型就基本上够用了。简短的主键可以在大量数据和复杂的关系
查询中表现出更好的性能。
自增量的值都是需要在系统中维护一个全局的数据值,每次插入数据时即对此次值进行增量取值。当在当量产生唯一标识的并发环境中,每次的增量取值都必须最此全局值加锁解锁以保证增量的唯一性。这可能是一个并发的瓶颈,会牵扯一些性能问题。
还有,如果要搞分布式数据库的话,这自增量字段就有问题了。因为,在分布式数据库中,不同数据库的同名的表可能需要进行同步复制。一个数据库表的自增量值,就很可能与另一数据库相同表的自增量