5. 对象标识的方法
对象标识是对象的一个特性,是用于区别该对象与所有其他对象的特征。通过对象标识,一些对象可以包含或引用其它对象。对象标识组成一个面向对象程序所操纵的对象空间的所有对象。在程序设计语言、传统数据库、和操作系统中,对象标识的最普通形式是用户定义的对象名字。
对象标识是一个对象区别于所有其他对象的一个特性。然而这个特性经常与对象的其他特性搞混。传统的关系数据库系统经常使用一个对象的内容作为它的标识。例如,在纯关系模型中,把关键字属性的唯一值作为对象的标识。每个对象的关键字属性值是不同的。这种方法也称为用内容作标识。在程序设计语言中,使用内存的位置作为标识。在操作系统中,使用操作系统的层次目录的路径名作为文件标识。
(1) 标识符关键字(Identifier Kegs)
标识对象的一个方法是使用唯一关键字或标识符关键字。这种机制在传统的关系数据库管理系统中最常用。在关系数据库中,一个标识符关键字由对象(记录)属性的子集组成,其值在一个关系中对所有记录是唯一的。
对象的标识关键字是由用户定义的,DBMS要保证数据库中的每个对象的关键字值是唯一的。使用标识符关键字用作对象标识有如下问题,这在传统数据库的应用中就可以发现:
①不允许表示不同语义的相等。例如,A=B,总表示是内容相等,不可能表示标识符相等。
②改变内容可能破坏引用完整性。因为标识符关键字是由用户选择定义的,数据库的设计者通常使用有语义的特性标识对象。例如,电话号码本中,使用职工的名字和地址作为标识属性。当职工地址改变时,该职工就有了新的标识,这会引起数据库的引用完整性问题。因为凡是引用该对象的实体都需要改变相应的引用,否则成为不合法的引用。因此,在实体的生命周期内不能修改关键字值。
③不统一性。不统一的主要原因是在不同表中的标识符关键字有不同的类型或不同的属性聚合。处理不同的属性集合或不同属性类型的标识符是有矛盾的。当同时用几个表工作时会增加许多困难。例如,当两个数据库必须合并时,
或者两个数据库配合使用时, 很可能会出现标识冲突,引起标识符关键字的改变。比如一个公司的职员用工作证号作关键字,另一个公司用身份证号作关键字,当两个公司合并时,应当改变一个关键字,这会引起某公司中职员的标识符不连续。
(2) 用位置作标识
用位置作标识,主要指对象在内存或外存中的存储地址。存储地址可唯一地标识一个对象。这些位置相关的标识符称为物理对象标识符。
当删除一个对象时,可使用删除对象的地址存储其他的新对象。当新对象占据了被删对象的相同的空间时,本来对老的被删对象的引用已是非法的,会再次成为合法的引用,从而也会产生错误。
根据数据库的性能,有时要重构数据库的存储空间,这时对象可能要从一个位置移动到另一个位置,标识也会随着改变。
(3) 操作系统路径名
标识对象可用的另一种方法是操作系统的路径名。操作系统中使用层次目录结构,文件名在目录内必须是唯一的,而且每个文件通过一个目录路径是可访问的,实际是目录名的连接。
使用连接的目录名字有如下问题:通常用户只记住名字或属性而记不住文件的路径。另一个问题是对象(文件)空间经常是一棵树。为了在多个目录中存储和访问相同的文件,用户必须对该文件做多个拷贝,除了浪费存储空间之外还必须维护文件的一致性。解决该问题的一种方法是把一个目录中的文件链接到另一个目录中的一个文件。这类似于面向对象的、支持对象标识系统中的引用共享。但它仍不如完全支持对象标识的系统。
(4) 独立的对象标识
建立一个独立的标识机制,使对象标识符 OID具有下面特性:
① 每个对象在产生时得到一个唯一的标识符。
② 该标识符在对象的整个生命周期内是固定不变的,而且是唯一的。
③ 一个被删除对象的标识符不可再用。
④ 对象标识符独立于对象的存储位置和对象的状态。
⑤ 用户定义的关键字仍然可以存在, 而且可以提供一些函数实现把一个对象的标识符转换成一个相关的用户定义的关键字, 或者相反方向的转换。
产生标识符通常必须考虑下面几部分内容, 以便从全局到局部数据库的范围内得到唯一性标识:
● 处理器标识;
● 对象产生的日期和时间。
为了进一步说明对象的语义,还可以增加上对象类型和数据库的标识。如果抛开标识符的定义成份,标识符与它标识的对象之间没有任何语义联系。要把标识符与它标识的对象一起存储,可使用一种特殊类型的扩展属性域存储标识符。
使用独立的对象标识符,在面向对象系统中实现了类型、状态、标识三分法:
● 对象是一个类的实例。
● 对象有一个状态,是它的实例变量的值。
● 每个对象有一个标识,独立于它的位置和状态,一个对象标识是创建该对象时产生的;不管对象的状态如何变化,标识是永久不变的。
标识把在一般语言中所用的指针概念形式化了。使用标识不需要重复开销和标识关键字。使用标识时,系统中的每个对象都有一个相关联的逻辑标识符(指针)。
|