Other techniques that are frequently used in programming languages to support identity
are variable names and pointers (or virtual memory addresses), but these approaches also
compromise object identity (Khoshafian and Abnous, 1990). For example, in ‘C’ and C++
an OID is a physical address in the process memory space. For most database purposes
this address space is too small: scalability requires that OIDs be valid across storage
volumes, possibly across different computers for distributed DBMSs. Further, when an
object is deleted, the memory formerly occupied by it should be reused, and so a new
object may be created and allocated to the same space as the deleted object occupied. All
references to the old object, which became invalid after the deletion, now become valid
again, but unfortunately referencing the wrong object. In a similar way moving an object
from one address to another invalidates the object’s identity. What is required is a logical
object identifier that is independent of both state and location. We discuss logical and
physical OIDs in Section 26.2.