domingo, 18 de mayo de 2014

DBOR, referencia entre objetos SQL

Cada objeto en una tabla tiene un identificador (id) , nosotros podemos definir atributos en una clase que sean una referencia a un objeto de otra tabla, de esta forma se puede implementar las relaciones entre tablas que almacenan objetos.

Oracle utiliza el operador "REF" , que devuelve el id de los objetos de una tabla de objetos. Un atributo de tipo "REF" guarda la referencia a un objeto del tipo definido e implementa una relacion entre los dos tipos de objetos. Esta referencia permite acceder a los objetos referenciados y modificar la información , pero no se puede operar directamente sobre la referencia. (dicho con otras palabras, no es un puntero) .


Explicacion para tontos:
Tienes una tabla A que guarda objetos A, y una tabla B que guarda objetos B,  en la clase A tienes un atributo que hace referencia a un objeto B , pero no necesariamente tiene que existir dentro de la tabla B.

entonces , si quieres que en la tabla A solo se guarden objetos con referencia a objetos B , QUE SÍ EXISTEN,  y se guardan en la tabla B, tienes que especificarlo con el operador "SCOPE" ,  de esta forma se evita guardar espacio en memoria para un ipotetico objeto B que aun no existe en la tabla B.


El siguiente ejemplo muestra como se restringe que dentro de la tabla B solo se puedan añadir objetos que  sí existen dentro de la tabla A

Ejemplo :
CREATE TYPE  obj_A  AS OBJECT( .... .... .... ); /* Clase  A*/

CREATE TABLE    tab_A    OF    obj_A;

CREATE TYPE   obj_B   AS OBJECT (     /* Clase  B*/
             ordnum NUMBER,
             cliente    REF   obj_A,
             fechpedido DATE,
             direcentrega direccion_t);

CREATE TABLE    tab_B    OF obj_B  (
             PRIMARY KEY (ordnum),
             SCOPE FOR (cliente) IS tab_A);
);



PROBLEMA :  al borrar un objeto de la tabla  A , en la tabla B los objetos aun mantienen la referencia al objeto borrado, y al hacer un select , Oracle muestra un error de referencia colgada (dangling references)
, para evitar esto se pude deshacer la referencia con "DEREF", pero  la solución más facil es hacer esa referencia que sea una clave externa (foreign key) . La tabla B quedaría de esta forma:
CREATE TABLE    tab_B    OF obj_B  (
             PRIMARY KEY (ordnum),
             FOREIGN KEY  (cliente) REFERENCES  tab_A,
            ON DELETE CASCADE    /*si se borrar un objeto A se borran todos los B que estén relacionados */
);





























4 comentarios: