La identidad de los objetos es un concepto de
identidad más potente que el que suele hallarse en los lenguajes de
programación o en los modelos de datos que no se basan en la programación
orientada a objetos.
Ejemplos de identidad.
• Valor. Se utiliza un valor de datos como
identidad. Esta forma de identidad se utiliza en los sistemas relacionales. Por
ejemplo, el valor de la clave primaria de una tupla identifica a la tupla.
• Nombre. Se utiliza como identidad un
nombre proporcionado por el usuario. Esta forma de identidad suele utilizarse
para los archivos en los sistemas de archivos. Cada archivo recibe un nombre
que lo identifica de manera unívoca, independientemente de su contenido.
• Incorporada. Se incluye el concepto de
identidad en el modelo de datos o en el lenguaje de programación y no hace
falta que el usuario proporcione ningún identificador. Esta forma de identidad
se utiliza en los sistemas orientados a objetos. Cada objeto recibe del sistema
de manera automática un identificador en el momento en que se crea.
Los lenguajes orientados a objetos proporcionan la posibilidad de
hacer referencia a los objetos. El atributo de un tipo puede ser una
referencia a un objeto de un tipo especificado. Por ejemplo, en SQL se puede
definir un tipo Departamento, con campos nombre y director,
que es una referencia al tipo Persona, y una tabla departamentos de
tipo Departamento, como sigue:
create
type Departamento( nombre varchar(20), director
ref(Persona) scope persona
)
create table departamentos of Departamento
La referencia en este ejemplo está restringida a tuplas de la
tabla persona. La restricción de scope de una referencia a las
tuplas de una tabla es obligatoria en SQL, y hace que las referencias se
comporten como claves externas.
Se puede omitir la
declaración scope persona de la declaración de tipos y en su
lugar añadirla a la instrucción create table.
create table departamentos of Departamento
(director with options scope persona)
Para inicializar un
atributo referencia es necesario obtener el identificador de la tupla a la que
se va a hacer referencia. Se puede obtener el valor del identificador de una
tupla mediante una consulta. Así, para crear una tupla con el valor referencia,
se puede crear en primer lugar la tupla con una referencia nula y después establecer
la referencia:
insert
into departamentos
values (‘Informática’,
null)
update departamentos
set director
= (select ref(p) from persona
as p where nombre = ‘Juan’)
where nombre =
‘Informática’
Esta sintaxis para acceder
al identificador de una tupla está basada en la sintaxis de Oracle. SQL adopta
un enfoque diferente, en el que la tabla referenciada debe tener un atributo
que almacene el identificador de la tupla. Este atributo, denominado atributo
autorreferencial, se declara añadiendo la cláusula ref is a la
instrucción create table.
create table persona of Persona
ref is ido system
generated
Donde ido es un
nombre de atributo, no una palabra clave. La subconsulta anterior podría usar
select p.ido
en lugar de select ref(p).
Una alternativa a los
identificadores generados por el sistema es permitir a los usuarios generar
identifica-dores. El tipo del atributo autorreferencial se debe especificar
como parte de la definición de tipos de la tabla referenciada, y la definición
de tabla debe especificar que la referencia la genera el usuario (user
generated).
create
type Persona
(nombre varchar(20),
dirección
varchar(20))
ref using
varchar(20) create table persona of
Persona ref is ido user generated
Al insertar una tupla en persona se debe proporcionar un
valor para el identificador:
insert into persona values
(‘01284567’, ‘Juan’, ‘Plaza Mayor, 1’)
Ninguna otra tupla de persona
o sus supertablas pueden tener el mismo identificador. Se puede entonces
usar el valor del identificador al insertar una tupla en departamentos,
sin necesitar una consulta separada para obtener el identificador.
insert into departamentos
values (‘Informática’, ‘01284567’)
Es posible incluso usar un
valor existente de clave primaria como identificador, incluyendo la cláusula ref
from en la definición de tipos:
create type Persona (nombre
varchar(20) primary key, dirección varchar(20))
ref from nombre
create table persona of Personaref is ido derived
Nótese que la definición de tabla
debe especificar que la referencia es derivada y aún debe especificar un nombre
de atributo autorreferencial. Al insertar una tupla en departamentos, se
puede usar:
insert
into departamentos values (‘Informática’,
‘Juan’)
Referencias
Silberschatz,
A. (2002). Fundamentos de Bases de Datos. Madrid: McGrauHill, Pag 217-218.
No hay comentarios.:
Publicar un comentario