Identidad de los objetos y tipos de referencia en SQL

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 atri­buto 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 Per­sona, y una tabla departamentos de tipo Departa­mento, 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 refe­rencia 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 instruc­ció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 esta­blecer 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 autorre­ferencial, 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 cla­ve. 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 espe­cificar 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 proporcio­nar un valor para el identificador:

insert into persona values
(‘01284567’, ‘Juan’, ‘Plaza Mayor, 1’)

Ninguna otra tupla de persona o sus supertablas pue­den tener el mismo identificador. Se puede entonces usar el valor del identificador al insertar una tupla en depar­tamentos, sin necesitar una consulta separada para obte­ner 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 nom­bre 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