Mostrando entradas con la etiqueta DBOR. Mostrar todas las entradas
Mostrando entradas con la etiqueta DBOR. Mostrar todas las entradas

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 */
);