Sie sind auf Seite 1von 147

Universitat de Val`ncia e

Departament dInform`tica a

'

Bases de datos ODMG/C++ orientadas a objetos


Cuando se utiliza una base de datos orientada a objetos bajo C++, se emplea un mismo modelo de objetos tanto en la base de datos como en las aplicaciones. La declaracin de clases de la aplicacin C++ sirve como esquema o o de denicin de la base de datos, permitiendo a los desarrolladores o el empleo de un lenguaje y un esquema de diseo familiares. n

Los desarrolladores disfrutan de las siguientes ventajas: No necesitan denir el diseo de la aplicacin en C++ y adems n o a en un lenguaje de base de datos. No necesitan traducir la estructura de la informacin entre el o modelo utilizado en la aplicacin y el utilizado por la base de o datos. Comparte un sistema unico y extensible entre la aplicacin y la o base de datos. Este modelo compartido es la caracter stica primaria de una base de datos orientada a objetos y la causa de su utilidad. En este cap tulo analizaremos las siguientes operaciones: Denir el esquema de la base de datos. Crear nuevas instancias de objeto en la base de datos. Asociar un nombre con una instancia y acceder a la instancia mediante dicho nombre. Establecer y navegar a travs de las relaciones entre instancias. e & Modicar y borrar una instancia. %
DBD-13019

Diseo de Bases de Datos n

ODMG-1

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin o


En este ejemplo desarrollaremos una aplicacin simple para o gestionar una lista de los regalos que han de recibir un conjunto de individuos. El modelo orientado a objetos consiste en dos clases: La clase Gift. La clase GiftList que representa al conjunto de personas y los regalos que recibirn. La clase GiftList mantiene una lista a enlazada simple de objetos Gift. En la gura se representan estas clases y sus relaciones.
GiftList
1 0..1 gifts 1 0..1 next next gifts

GiftList

Gift

Gift

&
Diseo de Bases de Datos n ODMG-2

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

Las clases se declaran en un chero header C++ (supongamos que nombrado giftlist.hpp) cuyo listado ser a:
class Gift { friend c l a s s G i f t L i s t ; friend o s t r e a m& operator<<(o s t r e a m &, const G i f t L i s t &); public : G i f t ( const char fn , const char ln , const char g i f t , unsigned long c ) ; Gift ( ) ; friend o s t r e a m& operator<<(o s t r e a m &, const G i f t &); friend i s t r e a m& operator>>( i s t r e a m &, G i f t &); private : char f i r s t n a m e [ 1 6 ] ; char l a s t n a m e [ 1 6 ] ; char g i f t d e s c r [ 3 0 ] ; unsigned long c o s t ; G i f t ne x t ; }; class Gift List { public : G i f t L i s t ( const char n , unsigned long b ) ; GiftList () ; friend o s t r e a m& operator<<(o s t r e a m &, const G i f t L i s t &); void a d d G i f t s ( i s t r e a m &); private : char name [ 2 0 ] ; unsigned long budget ; Gift g i f t s ; };

&
Diseo de Bases de Datos n ODMG-3

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


#include < g i f t l i s t . hpp> G i f t L i s t : : G i f t L i s t ( const char nm, unsigned long b ) : budget ( b ) { s t r n c p y ( name , nm, 1 9 ) ; name [ 1 9 ] = 0 ; } G i f t : : G i f t ( const char fn , const char ln , const char g i f t , unsigned long c ) : cost ( c) { s t r n c p y ( f i r s t n a m e , fn , 1 5 ) ; f i r s t n a m e [ 1 5 ] = 0 ; s t r n c p y ( l a s t n a m e , ln , 1 5 ) ; l a s t n a m e [ 1 5 ] = 0 ; strncpy ( g i f t d e s c r , g i f t , 2 9 ) ; g i f t d e s c r [ 2 9 ] = 0; } Gift : : Gift () : cost (0) { first name [ 0 ] = 0; last name [ 0 ] = 0; gift descr [ 0] = 0; }

&
Diseo de Bases de Datos n ODMG-4

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

Supongamos ahora que decidimos que las instancias de esas clases deben almacenarse en una base de datos orientada a objetos: Necesitaremos realizar algunos cambios sobre las clases para conferirles persistencia. En este contexto, persistencia signica que el objeto se almacena en la base de datos y de este modo sobrevive a la ejecucin de la aplicacin. o o Las instancias de una clase con capacidad de persistencia pueden almacenarse en una base de datos. En primer lugar, la aplicacin debe crear una base de datos. o Los desarrolladores de DBMSs proporcionan un comando o una interface grca con este objetivo. a El estndar ODMG no establece ningn dictado a este respecto, a u dejando que el vendedor suministre el procedimiento que estime conveniente. Supongamos que hemos creado una base de datos denominada Gifts utilizando una de las herramientas suministradas por el vendedor. En siguiente paso consiste en denir un esquema. En una base de datos C++, el esquema deriva directamente de las clases declaradas en la aplicacin C++. o Una utilidad, denominada Schema Capture Tool lee las cabeceras (headers) de la aplicacin y genera el esquema o correspondiente. El Schema Capture Tool puede generar cdigo adicional que o tambin deber enlazarse (link) en la aplicacin. e a o

&

Diseo de Bases de Datos n

ODMG-5

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

En la gura se describen los procedimientos y componentes implicados en la compilacin de una aplicacin de base de datos o o orientada a objetos.
Headers C++ del esquema de clases de la aplicacin

Diccionario

Creacin del Herramienta de captura de esquema esquemas Posiblemente

Ficheros fuente adicionales especficos para la gestin de la cache del cliente

Headers C++ del esquema de clases de la aplicacin (posiblemente mejorados)

Ficheros fuentes C++ de la aplicacin

Compilador C++

Libreras propietarias de la base de datos

Ficheros objeto de la aplicacin

Editor de enlaces

Aplicacin

&
Diseo de Bases de Datos n ODMG-6

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


Es necesario realizar algunos cambios a las clases C++ antes de poder ejecutar la herramienta de captura del esquema. 1. En ODMG, una clase es persistente si deriva de la clase base d Object. Las clases Gift y GiftList deben, por tanto, derivar de la clase d Object. 2. Un puntero puede contener la direccin en memoria de un o objeto, pero esa direccin carece de signicado para cualquier o otro proceso. Por tanto, no basta con almacenar el valor del puntero en la base de datos y esperar que puede ser reutilizado por otra aplicacin. ODMG dene una clase puntero inteligente o (smart pointer class) denominada d Ref<T> para hacer referencia a un objeto de la clase T. Las instancias de esta clase pueden almacenarse en la base de datos y utilizarse para hacer referencia a objetos de sta. Es requisito indispensable que la e clase T derive de la clase base d Object. Para almacenar instancias de nuestras clases Gift y GiftList en la base de datos es necesario cambiar los punteros al tipo d Ref<T>. Estos dos cambios son los unicos requeridos en las deniciones de las clases Gift y GiftList para convertirlas en persistentes.

&
Diseo de Bases de Datos n ODMG-7

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


El header modicado quedar a:
#include <odmg . h> c l a s s G i f t : public d O b j e c t { friend c l a s s G i f t L i s t ; friend o s t r e a m& operator<<(o s t r e a m &, const G i f t L i s t &); public : G i f t ( const char fn , const char ln , const char g i f t , unsigned long c ) ; Gift ( ) ; friend o s t r e a m& operator<<(o s t r e a m &, const G i f t &); friend i s t r e a m& operator>>( i s t r e a m &, G i f t &); private : char f i r s t n a m e [ 1 6 ] ; char l a s t n a m e [ 1 6 ] ; char g i f t d e s c r [ 3 0 ] ; unsigned long c o s t ; d Ref<G i f t > ne x t ; }; c l a s s G i f t L i s t : public d O b j e c t { public : G i f t L i s t ( const char n , unsigned long b ) ; GiftList () ; friend o s t r e a m& operator<<(o s t r e a m &, const G i f t L i s t &); void a d d G i f t s ( i s t r e a m &); private : char name [ 2 0 ] ; unsigned long budget ; d Ref<G i f t > g i f t s ; };

&
Diseo de Bases de Datos n ODMG-8

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

Una vez que hemos ejecutado la utilidad de captura y denido un esquema, cualquier aplicacin puede insertar objetos en la base de o datos. Toda operacin de interaccin con una base de datos debe o o enmarcarse en una transaccin, que se representa como una o instancia de la clase d Transaction. Utilizamos la clase d Database para abrir la base de datos. En la gura se muestra el cdigo de una aplicacin que crea una o o instancia persistente de GiftList y le asigna un nombre.
#include <odmg . h> d D a t a ba s e db ; const char const db name = G i f t s ; i n t main ( i n t a r g c , char a r g v [ ] ) { db . open ( db name ) ; d Transaction tx ; tx . begin ( ) ; char name = a r g v [ 1 ] ; unsigned long budget = a t o i ( a r g v [ 2 ] ) ; G i f t L i s t g i f t l i s t = new(&db , G i f t L i s t ) G i f t L i s t ( name , budget ) ; db . s e t o b j e c t n a m e ( g i f t l i s t , name ) ; t x . commit ( ) ; db . c l o s e ( ) ; return 0 ; // Valida la transaccion // Cierra la base de datos // Inicia una transaccion // Abre la base de datos

&

%
ODMG-9 DBD-13019

Diseo de Bases de Datos n

Universitat de Val`ncia e

Departament dInform`tica a

'

&
Diseo de Bases de Datos n ODMG-10

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


Declaramos una instancia global de la clase d Database con el nombre db para que sea accesible por todas las funciones de la aplicacin. o El operador new invocado ha sido redenido en la clase d Object para que devuelva un puntero a una instancia de d Database. Esta llamada crea una instancia de GiftList permanente en la base de datos asociada a la variable db. La siguiente l nea utiliza db para asociar un nombre con la instancia GiftList. Slo es necesario aadir dos l o n neas para crear y dar nombre a la instancia. La aplicacin no requiere el uso de un lenguaje de bases de o datos embebido como SQL. Tampoco es necesario traducir el objeto entre la representacin o de la aplicacin y de la base de datos. o

&
Diseo de Bases de Datos n ODMG-11

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


Escribamos ahora una aplicacin que acceda a la instancia GiftList o por su nombre y la imprima en la salida estndar (standard output a stream). El cdigo resultante es: o
#include <odmg . h> d D a t a ba s e db ; const char const db name = G i f t s ; i n t main ( i n t a r g c , char a r g v [ ] ) { db . open ( db name ) ; d Transaction tx ; tx . begin ( ) ; char name = a r g v [ 1 ] ; d Ref<G i f t L i s t > g i f t l i s t = db . l o o k u p o b j e c t ( name ) ; if ( g i f t l i s t . is nu ll () ) { c e r r << No e x i s t e l a l i s t a de r e g a l o s con e l nombre ; c e r r << name << e n d l ; return 1; } c o ut << g i f t l i s t ; t x . commit ( ) ; db . c l o s e ( ) ; return 0 ; } // Valida la transaccion // Cierra la base de datos // Inicia la transaccion // Abre la base de datos

&
Diseo de Bases de Datos n ODMG-12

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


La funcin lookup object miembro de la clase d Database o devuelve una referencia a la instancia nombrada. Si el nombre no se corresponde con algn objeto de la base de datos, la u funcin devuelve una referencia nula. o La variable giftlist del tipo d Ref<GiftList> se declara e inicializa con el valor de retorno de lookup object. La funcin is null es del tipo d Boolean, denido por el o ODMG y que puede tomar dos valores d False y d True (cero y no-cero respectivamente). La funcin is null devuelve true si o giftlist tiene un valor nulo y false si hace referencia a una instancia de GiftList. El siguiente bloque imprime el objeto en la salida estndar. El a operador <{ requiere una referencia a un objeto de la clase GiftList, por lo que aplicamos a giftlist el operador de derreferencia (*) de d Ref<GiftList>. Este operador de derreferencia provoca que el objeto sea accedido automticamente desde la base de datos y sea a instanciado en el espacio de direcciones de la aplicacin. o La aplicacin no requiere software adicional para proyectar el o objeto desde la base de datos a su representacin C++. o

&
Diseo de Bases de Datos n ODMG-13

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

La clase GiftList cuenta con una funcin miembro denominada o addGifts. Esta funcin lee un regalo por l o nea desde la entrada estndar a hasta que se alcanza un EOF. Cada l nea contiene la informacin necesaria para inicializar una o instancia Gift. El cdigo de la funcin addGifts es: o o
void G i f t L i s t : : a d d G i f t s ( i s t r e a m &i s ) { Gift g i f t ; m a r k m o di f i e d ( ) ; while ( i s . peek ( ) != EOF ) { g i f t = new(&db , G i f t ) G i f t ( ) ; i s >> g i f t ; g i f t >ne x t = g i f t s ; gifts = gift ; } }

// Crea un Gift // Lee de is

Esta funcin modica un objeto GiftList: es necesario realizar o previamente una llamada a mark modified. Las asignaciones a los miembros gifts de GiftList y next de Gift establece una relacin entre las instancias en la base de o datos. La funcin addGifts puede mejorarse permitiendo que rechace o la adicin de un nuevo regalo si se sobrepasa el presupuesto o asignado (budget).

&

Diseo de Bases de Datos n

ODMG-14

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

Modicaremos ahora el cdigo anterior para que, en lugar de o imprimir el objeto GiftList invoque a la funcin addGifts. El o listado correspondiente es:
#include <odmg . h> d D a t a ba s e db ; const char const db name = G i f t s ; i n t main ( i n t a r g c , char a r g v [ ] ) { db . open ( db name ) ; d Transaction tx ; tx . begin ( ) ; char name = a r g v [ 1 ] ; d Ref<G i f t L i s t > g i f t l i s t = db . l o o k u p o b j e c t ( name ) ; if ( g i f t l i s t . is nu ll () ) { c e r r << No e x i s t e l a l i s t a de r e g a l o s con e l nombre ; c e r r << name << e n d l ; return 1; } g i f t l i s t >a d d G i f t s ( c i n ) ; t x . commit ( ) ; db . c l o s e ( ) ; return 0 ; } // Valida la transaccion // Cierra la base de datos // Inicia la transaccion // Abre la base de datos

&

El operador -> est denido en la clase d Ref<GiftList> y a devuelve un puntero a la instancia GiftList correspondiente.

%
DBD-13019

Diseo de Bases de Datos n

ODMG-15

))Universitat de Val`ncia e

))

))Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o

Para vericar que las instancias de la clase Gift se han aadido n correctamente al objeto GiftList, podemos imprimir este objeto haciendo uso del operador ((. Dicho operador es reemplazado (overloaded ) en la clase GiftList.
)) ))ostream & operator < <( ostream & os , const GiftList & gl ) )){ )) d_Ref < Gift > gift ; )) os << gl . name << " " << gl . budget << endl ; )) for ( gift = gl . gifts ; ! gifts . is_null (); gift = gift - > next ) )) os << * gift ; )) return os ; ))} ))

))El bucle for recorre las instancias Gift asociadas a la instancia GiftList. El recorrido entre instancias mediante una referencia a objetos como d Ref<T> es el mecanismo ms elemental para acceder a objetos a relacionados. ))Siguiendo con el ejemplo, necesitamos tambin borrar una e instancia GiftList y todas sus instancias Gift asociadas de la base de datos.
)) ))GiftList ::~ GiftList () )){ )) d_Ref < Gift > gift , giftn ; )) )) for ( gift = gifts ; ! gift . is_null (); gift = giftn ) { )) giftn = gift - > next ; )) delete gift . ptr (); )) } ))} ))

&

))Diseo de Bases de Datos n

))ODMG-16

))DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


Mediante este ejemplo, hemos mostrado como utilizar referencias a objetos para crear instancias en la aplicacin. Una aplicacin mayor o o puede contener muchas referencias a la misma instancia. El objeto se crea en la aplicacin cuando se produce la primera o referencia y la base de datos mantiene la informacin acerca de o qu objeto est siendo accedido por la aplicacin. Por tanto, e a o cualquier llamada subsecuente para instanciar este mismo objeto devolver un puntero al rea de memoria de la aplicacin a a o que lo contiene. Este proceso permite acceder de forma eciente a los datos, ya que no es necesario volver a acceder a la informacin contenida o en almacenamiento secundario. Esta capacidad proporciona una gran ventaja a los DBMSs orientados a objetos en cuando a rendimiento y velocidad de acceso. Las bases de datos orientadas a objetos se caracterizan por su transparencia: Puesto que el mismo paradigma es compartido por la base de datos y la aplicacin, los objetos pueden proyectarse de un lado o al otro de forma no intrusiva. La base de datos es mucho menos visible a la aplicacin que o cuando se emplean otras tecnolog de bases de datos. as Una consecuencia directa de estos aspectos es la importante reduccin en la complejidad y en los costes de desarrollo. o &
Diseo de Bases de Datos n ODMG-17

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplo de una aplicacin . . . o


Conclusiones: El modelo de objetos de C++ sirve no slo como esquema sino o tambin como interface con la base de datos. A medida que la e aplicacin itera sobre una coleccin de objetos derrefenciados se o o requiere menor intervencin del ODBMS y la aplicacin o o navega a travs de objetos residentes en memoria. Por e supuesto, este proceso de navegacin est dando lugar a accesos o a sobre la base de datos si los objetos no estn todav en la a a memoria del programa, pero esta actividad permanece oculta a la aplicacin. o El software de la base de datos fuerza la transparencia proporcionando una cache de objetos para la aplicacin. Se o trata de una regin en la memoria de la aplicacin que contiene o o a los objetos de la base de datos que han sido accedidos por la aplicacin. Cuando una aplicacin pretende modicar un objeto o o debe invocar a la funcin mark changed de la clase d Object. o La aplicacin no tiene que propagar sus modicaciones a la base o de datos. Cuando se completa la transaccin (commit), el o ODBMS escribe en la base de datos automticamente aquellos a objetos que lo requieran. Este mecanismo reduce signicativamente los costes de desarrollo ya que es posible desarrollar y utilizar librer que modican objetos sin as necesidad de introducir mecanismos para coordinarse con las aplicaciones que utilizan la librer a. &
Diseo de Bases de Datos n ODMG-18

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Bases de datos, transacciones y gestin de excepciones o

Acceso a la base de datos El estndar ODMG proporciona un mecanismo para acceder a slo a una base de datos. La implementacin permite el acceso a o o varias bases de datos, pero el estndar no lo requiere. a Para que una aplicacin pueda acceder a los objetos de una base o de datos primero debe abrir la base de datos. La clase ODMG d Database proporciona la funcin open que es o invocada con el nombre de la base de datos que se desea abrir. La enumeracin access status puede suministrarse o opcionalmente para indicar el modo de acceso. Supongamos que una aplicacin mantiene informacin acerca de los o o sueldos en una base de datos corporativa denominada Personal. El siguiente cdigo abrir la base de datos: o a d Database db ; db . open ( P e r s o n a l ) ; El access status por omisin es d Database::read write. o Para acceder a la base de datos en exclusiva, se especica el acceso d Database::exclusive: d Database db ; db . open ( P e r s o n a l , d Database : : e x c l u s i v e ) ; Es necesario abrir la base de datos antes de iniciar cualquier transaccin. Una vez que la aplicacin a terminado las transacciones o o sobre la base de datos, debe cerrarla mediante una llamada a la funcin close. o

&

Diseo de Bases de Datos n

ODMG-19

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Transacciones La clase ODMG d Transaction proporciona el conjunto t pico de operaciones de una transaccin y sirven para agrupar una serie de o operaciones iniciadas por la aplicacin. o Todas las operaciones que se llevan a cabo sobre objetos permanentes deben realizarse dentro de una transaccin. o Una transaccin se inicia mediante una llamada a begin: o d T r a n s a c t i o n tx ; tx . b e g i n ( ) ; // // Lleva a cabo las operaciones sobre // los objetos de la base de datos // tx . commit ( ) ; Una transaccin puede nalizarse de varias formas: o Mediante una la llamada a la funcin commit que provoca que o todas las operaciones de creacin, modicacin y borrado de o o objetos permanentes que se hayan realizado durante la transaccin sean validados en la base de datos. Adems, todos o a los objetos se eliminan de la cache de la aplicacin y se levantan o los locks adquiridos por la transaccin. o Llamando a la funcin checkpoint. Los datos se validan en la o base de datos pero la aplicacin retiene todos los objetos y los o locks. Mediante la llamada a abort. Se eliminan todos los locks de la transaccin pero no se aplica ningn cambio sobre la base de o u datos. Si una transaccin est activa y se invoca al destructor de o a instancia d Transaction, el proceso se aborta. Esto implica que

&

Diseo de Bases de Datos n

ODMG-20

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

si la instancia d Transaction es una variable local y se alcanza un return antes del commit, la transaccin se aborta. o

&
Diseo de Bases de Datos n ODMG-21

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Excepciones: gestin de fallos o El estndar ODMG utiliza el mecanismo de gestin de excepciones a o de C++:

#include <odmg . h> d d a t a b a s e db ; main ( i n t a r g c , char a r g v [ ] ) { int r e t ; d Transaction tx ; try { db . open ( P e r s o n a l ) ; tx . begin ( ) ; // // Lleva a cabo la transaccion // t x . commit ( ) ; db . c l o s e ( ) ; } catch ( d E r r o r &e r r ) { c e r r << DB E r r o r << e r r . g e t k i n d ( ) << ; c e r r << e r r . what ( ) << e n d l ; r e t = 1; } catch ( e x c e p t i o n &e ) { c e r r << E x c e pc i o n << e . what ( ) << e n d l ; r e t = 2; } catch ( . . . ) {

&

c e r r << E x c e pc i o n d e s c o n o c i d a \n ;

%
DBD-13019

Diseo de Bases de Datos n

ODMG-22

Universitat de Val`ncia e

Departament dInform`tica a

'

} return r e t ; }

&
Diseo de Bases de Datos n ODMG-23

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Dominios
Los dominios son los tipos de datos ms primitivos que se a pueden almacenar en una base de datos. Los objetos y sus relaciones normalmente constan de un conjunto de atributos y los dominios son los tipos de estos atributos. Los atributos son instancias de un tipo de dominio dado. Los dominios no son persistentes. Una instancia de un dominio puede convertirse en persistente cuando forma parte de un objeto permanente.

Categor de dominio as
Los dominios se clasican en categor basadas en el grado de as agregacin y encapsulado: o Tipos literales primitivos. Tipos compuestos. Tipos de datos abstractos. Todos los dominios tienen una implementacin que es un agregado o de componentes. Por ejemplo, un tipo que representa una fecha se considera atmico o aun cuando contiene varios componentes (ao, mes y d n a). De modo similar, una cadena se considera un tipo de dominio aunque se represente mediante un vector de caracteres. &
Diseo de Bases de Datos n ODMG-24

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Tipos literales primitivos El lenguaje C++ proporciona un conjunto de tipos literales primitivos entre los que se encuentran los siguientes: char (con y sin signo). short (con y sin signo). int (con y sin signo). long (con y sin signo). float y double. El tipo puntero, utilizado para contener la direccin de memoria de o una instancia de un tipo particular, no es soportado por el ODMG estndar aunque si por algunos vendedores. a Tipos primitivos en ODMG ODMG da soporte a un subconjunto de los tipos primitivos de C++: Tipo d Char d Octet d Boolean d Short d UShort d Long d ULong d Float Longitud 8 bits 8 bits Indenida 16 bits 16 bits 32 bits 32 bits 32 bits 64 bits Descripcin o Carcter ASCII. a Sin interpretacin. o d False y d True. Entero Short con signo. Entero Short sin signo. Entero con signo. Entero sin signo. Nmero de punto otante en simple u precisin (Estndar IEEE 754-1985). o a d Double Nmero de punto otante en doble u precisin (Estndar IEEE 754-1985). o a

&
Diseo de Bases de Datos n

ODMG-25

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Tipos primitivos en ODMG . . . Los tipos int y unsigned int no se incluyen en el ODMG ya que su tamao depende de la longitud de palabra de mquina. n a En entornos de varias arquitecturas un int no preserva su valor. Los tipos primitivos del ODMG tienen su origen en la interface de denicin del lenguaje (IDL) de la arquitectura CORBA. o Algunas implementaciones del ODMG requieren que se utilicen estos tipos en lugar de los C++. Tipos compuestos Un tipo compuesto consta de varios miembros accesibles directamente. (struct o class con miembros pblicos). u
struct Address { char char char char }; struct P o i nt { int int }; class Rectangle { public : P o i nt int int }; La clase Rectangle un miembro de tipo Point que es a su vez un tipo compuesto. origin ; width ; height ; x; y; street [40]; city [ 2 0] ; state [ 3 ] ; zip code [ 6 ] ;

// Operaciones...

&

Diseo de Bases de Datos n

ODMG-26

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase Rectangle se considera un tipo compuesto debido a que sus miembros son pblicos. u

&
Diseo de Bases de Datos n ODMG-27

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Tipos de datos abstractos Un tipo de datos abstracto representa una abstraccin que se o implementa mediante una clase. El trmino abstracto signica, en este contexto, un tipo de e datos denido por el usuario que tiene sentido en el dominio del problema. El ADT (Abstract Data Type) proporciona las operaciones que mantienen la integridad semntica y la consistencia interna de a las instancias. Un tipo de datos abstracto se distingue de un tipo compuesto debido a que el mecanismo de encapsulacin proporciona una o interface. La implementacin puede ser una agregacin compleja de o o componentes, pero no es accesible.

&
Diseo de Bases de Datos n ODMG-28

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Tipos de dominio ODMG El ODMG dene un conjunto de clases para representar abstracciones comunes. Estas clases soportan las formas cannicas o C++, que incluyen una funcin de inicializacin por omisin o o o (constructor nulo), operador de asignacin y destructor. o El ODMG dene una clase cadena de caracteres (string) o nimo de denominada d String que soporta slo el conjunto m operaciones necesario para almacenar cadenas de caracteres en una base de datos. Es decir, no est desarrollada para realizar complejas a operaciones de manipulacin de cadenas de caracteres. o El ODMG tambin soporta las siguientes clases para representar e fechas y tiempos: d Interval d Date d Time d Timestamp

Las instancias de estos dominios puede ser instancias temporales independientes o bien atributos embebidos en objetos permanentes.

&
Diseo de Bases de Datos n ODMG-29

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d String La clase d String representa una cadena de caracteres de longitud variable. Una instancia de d String se puede inicializar con una cadena de caracteres, otra instancia d String o nada (que inicializa la instancia a una cadena nula).
d String d String d String d String nullString ; // Constructor nulo composer ( Mozart ) ; p o p A r t i s t ( Mi c hae l Bol t on ) ; s inger ( popArtist ) ;

d String favorite ; composer = Beethoven ; // Asigna con char * f a v o r i t e = new d S t r i n g ( Richard Marx ) ; popArtist = f a v o r i t e ; // Asigna con d String

La clase d String no soporta directamente la interface iostream de C++, pero es posible denir los siguientes operadores:
i s t r e a m &operator>>(i s t r e a m &i s , d S t r i n g &s ) { char b u f f e r [ 2 5 6 ] ; i s . width ( 2 5 6 ) ; i s >> b u f f e r ; s = buffer ; return i s ; } ostream &operator<<(ostream &os , d S t r i n g &s ) { os << ( const char ) s ; // Limita a 256 chars

&

%
DBD-13019

Diseo de Bases de Datos n

ODMG-30

Universitat de Val`ncia e

Departament dInform`tica a

'

return os ; }

&
Diseo de Bases de Datos n ODMG-31

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d String . . . Los operadores de comparacin comparan una instancia o d String con otra d String o un vector de caracteres de C++. Una funcin miembro obtiene la longitud de la cadena de o caracteres y el operador [] accede a los caracteres mediante un ndice. Por ejemplo, la siguiente funcin traduce a maysculas una cadena o u de caracteres:
void makeUpperCase ( d S t r i n g &s ) { r e g i s t e r unsigned long i ; r e g i s t e r const unsigned long l e n = s . l e n g t h ( ) ; for ( i char if ( s[i] } } = 0 ; i < l e n ; i ++) { c = s[ i ]; i s a l p h a ( c ) && i s l o w e r ( c ) ) = ( char ) t ouppe r ( c ) ;

&
Diseo de Bases de Datos n ODMG-32

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' La clase d String . . . Las clases permanentes que requieren un atributo de tipo cadena de caracteres pueden utilizar tanto un d String como un vector de caracteres. El vector de caracteres tiene longitud ja. Una instancia d String contiene una cadena de longitud variable.

c l a s s Empleado : public Persona { char d String } g e n e r o [ 2 ] ; // H, M direccion ;

Con objeto de dar soporte a cadenas de caracteres de longitud variable, la base de datos orientada a objetos almacena el contenido de la cadena fuera del objeto. Esta aproximacin puede dar lugar a un cierto costo adicional en o la gestin de este tipo de objetos, aunque en general es m o nimo. Cuando se emplean cadenas de caracteres, los datos se encuentran directamente embebidos en el objeto, de modo que no es necesario gestionar y acceder a datos secundarios. Una cadena de caracteres se gestiona generalmente de forma ms rpida, por lo que es una buena alternativa cuando la a a cadena es pequea y var poco en longitud. n a &
Diseo de Bases de Datos n ODMG-33

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Interval La clase d Interval se utiliza para representar un lapso de tiempo. El resto de las clases relacionadas con tiempo y fechas tambin e la utilizan para determinadas operaciones aritmticas. e Una instancia se puede inicializar con valores de d horas, as, minutos y segundos. El d es la unidad ms grande que puede especicarse con a a d Interval. La funcin is zero puede utilizarse para comprobar si todas las o componentes son cero. La siguiente funcin inserta los lapsos de tiempo en el stream os: o
ostream &operator<<(ostream &os , d I n t e r v a l &i ) { os << I n t e r v a l o ( << i . day ( ) << da s ; os << i . hour ( ) << h o r a s ; os << i . minute ( ) << minutos ; os << i . s e c o n d s ( ) << s e gundos ) ; return os ; }

&
Diseo de Bases de Datos n ODMG-34

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' La clase d Interval La clase d Interval proporciona un conjunto completo de operaciones aritmticas y funciones de comparacin. Por ejemplo, e o admite componentes no normalizados, normalizando el valor cuando se accede a los componentes. En las siguientes l neas de cdigo, todas las variables acaban o conteniendo el valor 36 horas:
d Interval inter1 (1 ,12); d Interval inter2 ( inter1 ); d Interval inter3 (0 ,36); d Interval inter4 (0 ,24 ,1260); d Interval inter5 (0 ,12); d Interval inter6 (6); d Interval inter7 ; d I n t e r v a l i n t e r 8 (0 , 12); d I n t e r v a l i n t e r 9 (2 , 12); if ( inter5 < inter1 ) i n t e r 5 = i n t e r 1 ; i f ( i n t e r 1 == i n t e r 2 ) inter6 = inter6 / 4; i f ( i n t e r 1 + i n t e r 2 == i n t e r 3 2 ) inter7 = inter1 2 inter2 ; inter8 = d Interval (6) 3 inter9 ; // 1 dia, 12 horas // como antes // como antes // como antes // 12 horas // 6 dias // todo ceros // -12 horas // 1 dia, 12 horas

Las instancias de d Interval se utilizan frecuentemente cuando se lleva a cabo algn tipo de operacin aritmtica en instancias de las u o e clases d Date y d Timestamp. &
Diseo de Bases de Datos n ODMG-35

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Date

La clase d Date es una abstraccin que consiste en ao, mes y d o n a. Si una instancia se inicializa sin argumentos, se le asigna el valor de la fecha actual. Una funcin esttica, current, devuelve una o a instancia d Date con la fecha actual. Los componentes de la fecha se pasan al constructor como se indica:
d Date d Date today ; // Inicializado a la fecha actual cumple ( 1 9 9 9 , 1 2 , 1 4 ) ; // Year, Month & Day

Supongamos que se intenta inicializar una instancia con valores ilegales, como en:
d Date badDate ( 1 9 9 6 , 1 3 , 2 ) ;

En estos casos se genera la excepcin d Error DateInvalid. o Para evitarlo, el estndar proporciona una funcin booleana, a o is valid date, para vericar la validez de una fecha. Es posible acceder a todas las componentes de la abstraccin: o
ostream &operator<<(ostream &os , d Date &d ) { os . width ( 2 ) ; os << d . month ( ) ; os << / ; os . width ( 2 ) ; os << d . day ( ) ; os << / ; os << d . y e a r ( ) ; return os ; }

&

Weekday es una enumeracin embebida en la clase d Date que o identica los d de la semana, por ejemplo Monday o Tuesday. as

Diseo de Bases de Datos n

ODMG-36

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

a enumeracin denominada Month se utiliza para identicar los o meses del ao (January, February, etc. . . ). n

&
Diseo de Bases de Datos n ODMG-37

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Date . . .

El siguiente cdigo realiza algunas operaciones utiles sobre varias o fechas:


d Date d Date day ; // Dia actual today ( d Date : : c u r r e n t ( ) ) ; // Lo mismo

c out << Hoy e s << today << e n d l ; n c out << ++day << ma ana\n day = today + d I n t e r v a l ( 1 ) ; n c out << day << ma ana\n ; day = today ; c out << day << a y e r \n ; day = today ; day = 7 ; a c out << day << mismo d , semana pasada \n ; day += d I n t e r v a l ( 7 ) ; a c out << day << mismo d , semana que v i e n e \n ; day = today ; day . ne xt ( d Date : : Tuesday ) ; o c out << day << pr ximo martes \n ; day = today ; day . p r e v i o u s ( d Date : : F ri day ) ; c out << day << u l t i m o v i e r n e s \n ;

&
Diseo de Bases de Datos n ODMG-38

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

in t days = today . days i n m ont h ( ) today . day ( ) ; c out << days << da s para c o b r a r ! \ n ;

&
Diseo de Bases de Datos n ODMG-39

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Date . . .

Las siguientes funcin calcula el nmero de d hasta Navidad. Si o u as las navidades del ao actual ya han pasado, determina el nmero de n u d hasta las navidades del ao siguiente: as n
in t s h o p p i n g D a y s T i l l N e x t C h r i s t m a s ( ) { d Date today ; // Fecha actual d Date c h r i s t m a s ( today . y e a r ( ) , d Date : : December , 2 5 ) ; i f ( today > c h r i s t m a s ) { c h r i s t m a s = d Date ( today . y e a r ( ) + 1 , d Date : : December , 2 5 ) ; return c h r i s t m a s . d a y o f y e a r ( ) + today . days i n m ont h ( ) today . day ( ) + 1 ; } return c h r i s t m a s . d a y o f y e a r ( ) today . d a y o f y e a r ( ) ; }

El ODMG 2.0 aade una funcin que permite substraer dos n o instancias d Date y que devuelve una instancia d Interval:
in t s h o p p i n g D a y s T i l l N e x t C h r i s t m a s ( ) { d Date today ; // Fecha actual d Date c h r i s t m a s ( today . y e a r ( ) , d Date : : December , 2 5 ) ; i f ( today > c h r i s t m a s ) { c h r i s t m a s = d Date ( today . y e a r ( ) + 1 , d Date : : December , 2 5 ) ; } d I n t e r v a l i n t e r v = c h r i s t m a s today ;

&

%
DBD-13019

Diseo de Bases de Datos n

ODMG-40

Universitat de Val`ncia e

Departament dInform`tica a

'

return i n t e r v . days ( ) ; }

&
Diseo de Bases de Datos n ODMG-41

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Date . . .

Para determinar si una fecha se encuentra entre otras dos fechas, es posible utilizar la funcin is between. o La siguiente funcin determina si est vigente la garant de un o a a determinado producto:
d Date addMonths ( const d Date &d , unsigned in t months ) { r e g i s t e r unsigned in t i ; d Date dat e ( d . y e a r ( ) , d . month ( ) , 1 ) ; i f ( months >= 12 ) { i = months / 1 2 ; months = i 1 2 ; } f o r ( i = 0 ; i < months ; i ++) { dat e += dat e . days i n m ont h ( ) ; } // Ajustamos ahora el d del mes a in t dayofmonth = dat e . days i n m ont h ( ) < d . day ( ) ? dat e . days i n m ont h ( ) : d . day ( ) ; dat e += dayofmonth 1 ; // d actual del mes a return dat e ; } in t i s W a r r a n t y I n E f f e c t ( d Date &purc has e , unsigned in t months ) { // ms de un ao a n // obtiene nmero de aos u n

dat e = d Date ( d . y e a r ( ) + i , d . month ( ) , 1 ) ;

&

d Date warrantyDate ( addMonths ( purc has e , months ) ) ;

Diseo de Bases de Datos n

ODMG-42

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

return d Date : : c u r r e n t ( ) . i s b e t w e e n ( purc has e , warrantyDate ) ; }

&
Diseo de Bases de Datos n ODMG-43

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Date . . .

Un periodo de tiempo viene determinado por una fecha de inicio y una de n. La funcin overlap determina si dos periodos de tiempo o se solapan. Supongamos que los usuarios de una compa area han na e programado una serie de viajes que no se solapan. La lista de viajes es una lista encadenada simple ordenada por las fechas de viaje:
struct Trip { Trip ( const d Date &sd , const d Date &rd , struct Trip n ) : s t a r t D a t e ( sd ) , r e t u r n D a t e ( rd ) , ne xt ( n ) {} d Date d Date }; startDate ; returnDate ;

struct Trip ne xt ;

La funcin newTrip determina si es posible programar un nuevo o viaje para el usuario. Esta funcin admite como parmetros las o a fechas de inicio y n de viaje y un puntero que apunta al primer nodo de la lista (que supondremos que no est vac a a).
bool newTrip ( d Date s dat e , d Date e dat e , struct Trip & t r i p s ) { r e g i s t e r struct Trip tp ; f o r ( tp = &t r i p s ; tp ; tp = &(( tp)>ne xt ) ) { i f ( o v e r l a p s ( s dat e , e dat e , ( tp)>s t a r t D a t e , ( tp)>r e t u r n D a t e ) ) return f a l s e ; i f ( s d a t e < ( tp)> s t a r t D a t e ) break ; }

&

%
ODMG-44 DBD-13019

Diseo de Bases de Datos n

Universitat de Val`ncia e

Departament dInform`tica a

'

tp = new Trip ( s dat e , e dat e , tp ) ; return true ; }

&
Diseo de Bases de Datos n ODMG-45

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Time

a. La clase d Time se utiliza para representar una hora concreta del d Se gestiona empleando la zona horaria GMT (Greenwich Mean Time). Los componentes son horas (023), minutos (060) y segundos (059.9999). Inicializar una instancia con un valor invlido genera una a excepcin del tipo d Error TimeInvalid. o El constructor nulo genera una instancia con la hora actual. La funcin current tambin devuelve la hora actual. o e Dos ejemplos: d Time d Time time1 ; time2 ( d Time : : c u r r e n t ( ) ) ;

d Time horaDelBocata ( 1 0 , 3 0 , 0 . 0 f ) ; El estndar proporciona varias funciones para acceder a las a componentes de una instancia d Time. ostream &operator<<(ostream &os , const d Time &t ) { char f i l l c h a r s a v e = o s . f i l l ( ) ; o s . width ( 2 ) ; o s << : ; o s . width ( 2 ) ; & o s . f i l l ( 0 ) ; o s << t . minute ( ) ; %
DBD-13019

o s . f i l l ( ) ; o s << t . hour ( ) ;

os . f i l l ( f i l l c h a r s a v e ) ;

Diseo de Bases de Datos n

ODMG-46

Universitat de Val`ncia e

Departament dInform`tica a

'

return o s ; }

&
Diseo de Bases de Datos n ODMG-47

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Time . . . Embebido en la clase d Time existe un enum Time Zone con los nombres de las diferentes zonas horarias. La clase mantiene una zona horaria por omisin que se inicializa con el valor de la zona o horaria local en uso. La gestin de zona horaria se realiza o mediante las funciones: set Default Time Zone(Time Zone): Modica el valor de la zona horaria en uso. set Default Time Zone to local(): Restaura la zona horaria al valor local. La clase d Time cuenta con funciones aritmticas que utilizan e a instancias de la clase d Interval. Adems, las instancias de la clase d Interval se pueden sumar y substraer a una instancia d Time. La substraccin de dos instancias de la clase d Time da o como resultado una instancia de la clase d Interval. Los operadores de igualdad, desigualdad y comparacin se o pueden utilizar para comparar dos instancias d Time. La clase tambin proporciona varias funciones overlap para determinar e si dos periodos (especicados mediante dos instancias d Time) solapan.

&
Diseo de Bases de Datos n ODMG-48

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

La clase d Timestamp La clase d Timestamp proporciona una fecha y una hora y dene varias funciones para acceder a cada uno de estos componentes. La funcin esttica current devuelve una instancia o a d Timestamp con la fecha y hora actuales. Como en el resto de clases orientadas a fechas y tiempos, esta clase proporciona operaciones aritmticas, y varias funciones e overlap que operan sobre las dos instancias d Timestamp que denen un periodo. La clase d Timestamp proporciona ms ventajas que el mero apareo a de instancias d Date y d Time: las instancias de esta clase se tratan como un unico valor integrado respecto a las operaciones de actualizacin. Por ejemplo, consideremos el siguiente cdigo: o o d Timestamp d Interval t s += h r 1 8 ; El valor nal de ts es 1 de enero de 2000 a las 2:00 AM. t s (1999 , 12 , 31 , 8 ) ; hr 18 (0 , 1 8 );

&
Diseo de Bases de Datos n ODMG-49

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Uniones

Restricciones de uso de algunos tipos

Una union C++ dene una unidad de almacenamiento que contiene un valor que puede ser de alguno de los tipos de datos especicados en la denicin. o
union m u l t i t i p o { double d Ref<amount> }; float val ; amount ;

unsigned short s m a l l I n t ;

Se utiliza cuando los recursos de memoria son escasos y slo se o necesita uno de los tipos en un momento dado. Para determina el tipo de dato almacenado se emplea un indicador (type ag):
c l a s s MiClase { multi tipo in t // Otros atributos... }; void p r o c e s a M i C l a s e ( MiClase mp) { switch (mp>t i p o V a l o r ) { case 1 : // Utiliza mp-valor.oat val break ; case 2 : // Utiliza mp-valor.amount break ; case 3 : valor ; tipoValor ;

&

%
ODMG-50 DBD-13019

Diseo de Bases de Datos n

Universitat de Val`ncia e

Departament dInform`tica a

'

// Utiliza mp-valor.smallInt break ; } }

&
Diseo de Bases de Datos n ODMG-51

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Campos de bits La representacin binaria de los campos de bits var entre o a arquitecturas de mquina y entornos de compilacin. Una base de a o datos puede dar soporte y garantizar la correcta implementacin de o los campos de bits en un entorno homogneo (compilador, sistema e operativo y procesador), pero es poco probable que funcione correctamente si alguno de estos elementos cambia. Punteros y referencias C++ Las referencias C++ embebidas en objetos son tambin e problemticas. Por ejemplo, las siguiente clase cuenta con un a miembro, denominado ciudad que hace referencia a una clase Ciudad:
class Direccion { Ciudad &c i udad ; // Otros atributos };

El estndar ODMG no soporta punteros o referencias C++ como a atributos de un objeto almacenado en la base de datos. Una referencia C++ no puede almacenarse en la base de datos ni utilizarse para hacer referencia a un objeto persistente. Slo puede o utilizarse para hacer referencia a objetos transitorios. En las clases persistentes es necesario utilizar instancias de la clase d Ref<T> en lugar de punteros y referencias.

&
Diseo de Bases de Datos n ODMG-52

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Entidades persistentes

Una de las actividades principales durante la fase de anlisis de a un proyecto es descubrir todas las entidades en el dominio del problema que deben ser diseadas. Se dene una clase para cada n entidad que debe representarse en la aplicacin. o Una entidad consiste en un conjunto de propiedades que tambin es necesario determinar en la fase de anlisis. Esas e a propiedades incluyen atributos (de algn tipo de dominio), u relaciones (con otras instancias) y operaciones. Se representan en las clases mediante datos y funciones. Las instancias de las entidades normalmente se relacionan con otras instancias en el modelo orientado a objetos. Las relaciones estn incluidas en la declaracin de la clase. En las clases a o implicadas en las relaciones se embeben objetos especiales, proporcionados por muchas de las implementaciones de bases de datos orientadas a objetos. Discutiremos estos objetos ms a adelante. Las operaciones tambin estn asociadas con las clases y se e a implementan como funciones miembro. Deben proporcionar una interface que encapsula la abstraccin y que lleva a cabo todas o las modicaciones sobre las instancias. Encapsular la implementacin permite denir exactamente la semntica y o a minimiza la cantidad de software que necesita conocer los detalles de la clase. Es frecuente que una entidad tenga algn tipo de relacin IS-A u o con otras entidades. Esas relaciones se representan en C++ mediante relaciones de herencia entre clases. Una relacin IS-A o signica que existe una relacin es un tipo de entre clases (por o ejemplo, un coche es un tipo de veh culo).

&

Diseo de Bases de Datos n

ODMG-53

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Clases persistentes
En una base de datos C++, la declaracin C++ de las clases acta o u como esquema de denicin de la base de datos. Esta es una de las o mayores ventajas de una base de datos orientada a objetos. La clase base d Object Cuando una aplicacin utiliza la interface del ODMG, todas las o clases cuyas instancias deben almacenarse en la base de datos deben derivar, directa o indirectamente, de la clase base d Object.
c l a s s Persona : public d O b j e c t { public : d String d String }; apellido ; nombre ;

// Otros atributos de persona

La relaciones de herencia tambin se pueden denir entre clases e persistentes:


c l a s s Empleado : public Persona { public : // Propiedades de un empleado };

e Ya que la clase Persona deriva de d Object, Empleado tambin tiene capacidad de persistencia.

&
Diseo de Bases de Datos n ODMG-54

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Instancias El hecho de que la clase d Object proporcione persistencia no implica automticamente que todas las instancias de cualquier a clase que derive de ella sean persistentes. Las instancias pueden denirse como transitorias y es la llamada al operador new espec co lo que determina esta propiedad. Cada instancia persistente tiene un identicador de objeto (Object IDentier) que se emplea para referenciar al objeto. El identicador est asociado a la instancia hasta que sta es a e borrada y es inmutable: la aplicacin no tiene acceso al OID. o Slo los atributos pueden modicarse y esto no afecta a la o identidad del objeto. En este punto existe una gran diferencia con los sistemas relacionales, en donde el identicador se almacena en una columna de la tupla. La clase d Ref<T> se emplea para representar referencias a objetos. Cuando se almacena una instancia d Ref<T> en la base de datos, sta contiene el identicador del objeto referenciado. e Propiedades Las propiedades de una clase incluyen a los atributos y a las funciones. Cada propiedad tiene nombre y tipo (dominio). Se pueden utilizar los especicadores de control de acceso de C++ public, private y protected para controlar el acceso a las propiedades de la clase. La interface pblica de una clase debe u consistir en el conjunto de operaciones que representan la abstraccin que se est diseando. o a n &
Diseo de Bases de Datos n ODMG-55

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Atributos Los atributos se emplean para describir las caracter sticas de la entidad que se est diseando. Los atributos no tienen identidad a n (OID) y no se pueden referenciar en la base de datos de forma independiente. Un objeto establece el contexto en el cual residen sus atributos. Los atributes proporcionan los valores que denen el estado del objeto que los contiene. Es una buena pol tica de diseo de objetos declarar privados los n atributos de un objeto. Las operaciones son las que controlan todas las modicaciones y accesos a los atributos: son las responsables de mantener la integridad semntica del objeto. a Existen dos categor de atributos que tienen un tratamiento as diferente: Atributos estticos: En C++ el atributo esttico de una clase a a es una unica copia que es compartida por todas las instancias de la clase. El atributo esttico tiene mbito de clase y no est contenido a a a en cada instancia. Estos miembros no se almacenan en la base de datos, sino que residen en la seccin de datos de cada proceso de o aplicacin que incluye la clase. o

&
Diseo de Bases de Datos n ODMG-56

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Atributos . . . Atributos transitorios: Algunas bases de datos orientadas a objetos permiten declarar atributos transitorios: existen en el objeto mientras ste est en la memoria de la aplicacin, pero e a o no se almacenan en la base de datos. Estos atributos transitorios son utiles para representar datos directamente asociados al objeto durante la transaccin pero no es necesario almacenarlos o en la base de datos. Los datos pueden ser necesarios cuando se est llevando a cabo algn tipo de clculo en una transaccin a u a o pero cuyo valor no es vlido en el contexto de otra transaccin. a o La sintaxis var entre los diferentes productos de ODBMSs. a Algunos sistemas tratan todos los punteros como atributos transitorios. Otros sistemas requieren preceder la declaracin del atributo o con la palabra clave transient. El estndar ODMG no contempla esta capacidad. a Supongamos que se est utilizando una clase denominada a Formulario de la interface de usuario para mostrar los atributos del objeto en una ventana. Puede ser conveniente que una instancia de Persona haga referencia al objeto Formulario al que est asociado directamente: a
c l a s s Persona : public d O b j e c t { // Otros atributos de persona t r a n s i e n t F orm ul ari o }; f orm ;

&

La utilidad de captura de esquemas que analiza la declaracin o C++ de la clase encontrar los atributos transitorios y a tendr en cuenta que no deben ser almacenados. a

Diseo de Bases de Datos n

ODMG-57

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones Las operaciones pblicas deben proporcionar la interface que u representa a la abstraccin que se est diseando. Son o a n responsables de mantener la integridad semntica de una a instancia, decidiendo que modicaciones son vlidas. a Estas operaciones se pueden considerar las minitransacciones denidas para un objeto. Cada transaccin (identicada en la etapa de anlisis) que opera o a sobre una instancia debe denirse como una funcin miembro. o Tambin pueden emplearse para implementar atributos e derivados. Por ejemplo, la clase Persona puede denir una operacin edad: o
d U Short P e r s o n a : : edad ( ) const { d Date today = d Date : : c u r r e n t ( ) ; d U Short y e a r s = today . y e a r ( ) b i r t h . y e a r ( ) ; i f ( today . d a y o f y e a r ( ) < b i r t h . d a y o f y e a r ( ) ) y e a r s ; return y e a r s ; }

Si tanto los atributos almacenados como los derivados se acceden v operaciones no existe diferencia sintctica en la a a forma de acceso. Esta aproximacin, conocida como diseo de o n datos funcional (functional data modeling), proporciona una gran exibilidad ya que permite modicar la implementacin sin o afectar a las aplicaciones. Si todos los accesos se implementan mediante operaciones es posible aadir funcionalidad a una operacin que se ejecuta n o cada vez que se accede al atributo, proporcionando operaciones de tipo trigger. Los atributos derivados y los triggers se utilizan frecuentemente en otras tecnolog de bases de datos. as

&

Diseo de Bases de Datos n

ODMG-58

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Creacin de instancias o
Una instancia se crea mediante una llamada al operador new. Este operador se dene en el estndar ODMG como miembro de a la clase d Object, sin embargo algunas implementaciones aaden operadores adicionales para sacar partido de las n caracter sticas espec cas del ODBMS concreto. El operador new espec co utilizado para crear la instancia determina si sta ser transitoria o persistente. e a Una vez creada, una instancia transitoria no puede convertirse en persistente ni a la inversa. Creacin de instancias transitorias o Dos v para crear una instancia transitoria mediante la interface as del ODMG: Automtica: Todas las variables locales de una clase con a capacidad de persistencia son transitorias. Por ejemplo, la siguiente funcin declara una instancia de la clase Persona que o se comporta como una variable local: void f i c h a j e ( ) { Persona c a n d i d a t o ; ... } La variable local candidato no se almacena en la base de datos. &
Diseo de Bases de Datos n ODMG-59

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Creacin de instancias transitorias . . . o Mediante el operador new: El operador new admite dos formas para crear instancias transitorias. Por ejemplo, el siguiente cdigo crea dos instancias transitorias de la clase o Empleado derivada de la clase Persona: Empleado emp1 , emp2 ; emp1 = new Empleado ( ) ; emp2 = new( d Database : : tr a nsient m em o r y , Empleado ) Empleado ( ) ; El primer operador new emplea la sintxis estndar sin a a parmetros adicionales. Crea una instancia transitoria como a cualquier otro operador new de C++. El segundo operador new utiliza un argumento que es un puntero a un objeto d Database. Este puntero se utiliza para indicar en qu base de datos debe emplazarse el nuevo e objeto. El dato esttico pblico de la clase d database, a u transient memory, se utiliza para indicar que el nuevo objeto es transitorio. Si el primer argumento del operador new hubiese sido un puntero a una base de datos abierta, la instancia creada ser a persistente y se colocar en esa base de datos. a Algunas implementaciones necesitan conocer el tipo de instancia que se est creando. Desgraciadamente, esta informacin no a o est disponible de forma automtica en el operador new, por lo a a que debe incluirse en la llamada. &
Diseo de Bases de Datos n ODMG-60

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Creacin de instancias persistentes o Una instancia persistente se puede crear utilizando el siguiente operador new: d d a t a b a s e db ; // Apunta a una db abierta Empleado emp3 = new(&db , Empleado ) Empleado ( ) ; La instancia de d database debe referirse a una base de datos abierta. El operador new es la misma funcin empleada en el ejemplo o anterior, pero en este caso la instancia Empleado creada es persistente y se almacena en la base de datos apuntada por db. Agrupacin de instancias o Cuando se accede frecuentemente a un conjunto de objetos relacionados puede resultar util agruparlos f sicamente en la base de datos. Es posible indicar algunas opciones de agrupamiento cuando se crea la instancia. El agrupamiento (clustering) es una tcnica de e optimizacin que las aplicaciones pueden utilizar para: o Reducir el nmero de transferencias a disco. u Reducir la cantidad de memoria cache del cliente y del servidor requerida para acceder al objeto. En algunas arquitecturas, pueden incluso reducir el coste de las comunicaciones clienteservidor. En aquellas implementaciones que proyectan directamente los bloques de la base de datos en pginas de memoria del cliente, el a agrupamiento reduce la cantidad de memoria que requiere el cliente.

&

Diseo de Bases de Datos n

ODMG-61

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Agrupacin de instancias . . . o El ODMG proporciona una interface para especicar que una instancia debe agruparse: Empleado emp4 = new( emp3 , Empleado ) Empleado ( ) ;

El nuevo objeto emp4 se agrupar cerca del objeto a referenciado por emp3 y en la misma base de datos. El grado de proximidad que puede especicarse var entre las a diferentes implementaciones: puede ser la misma pgina, el a mismo segmento o simplemente la misma base de datos. Algunos proveedores proporcionan capacidades de agrupamiento espec cas, pero no son portables entre diferentes implementaciones del ODMG Algunas implementaciones son capaces de agrupar objetos de forma automtica; la aplicacin no necesita especicar el a o agrupamiento cuando se crea el objeto. El agrupamiento automtico se puede fundamentar en la clase de objeto creado o a en las relaciones con otros objetos de la base de datos.

&
Diseo de Bases de Datos n ODMG-62

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Inicializacin de instancias o En una base de datos orientada a objetos se emplean dos formas de inicializar un objeto: Cuando un objeto se crea por primera vez, es necesario inicializar cada atributo. En C++ son los constructores los que se encargan de llevar a cabo esta tarea sobre todos los objetos creados por la aplicacin. o La segunda forma de inicializacin se produce cuando un o proceso de aplicacin accede por primera vez a un objeto de la o base de datos creado con anterioridad por otro proceso de aplicacin. Este proceso, en el que el objeto se instancia en la o cache de un nuevo proceso, se conoce con el nombre de activacin y se ver ms adelante. o a a Los constructores: Sirven para el mismo propsito en una base de datos C++ que o en otros entornos orientados a objetos. Una aplicacin puede denir tantos constructores como sea o necesario para una clase. Aquellos atributos para los que no se especique un valor inicial deben inicializarse con un valor nulo, por lo que es recomendable denir un constructor nulo para cualquier tipo denido por el usuario.

&
Diseo de Bases de Datos n ODMG-63

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Inicializacin de instancias . . . o Como ejemplo, veamos cuales pueden ser los constructores para las clases Persona y Empleado.
Persona : : Persona ( const char fname , const char lname , d Date bd , const struct Address &addr , const char phone ) : f n a m e ( fname ) , b i r t h ( bd ) , { s t r n c p y ( phone , phone , 1 0 ) ; phone [ 1 0 ] = 0 ; f o r m = new Form ( ) ; } Persona : : Persona ( ) { delete } Empleado : : Empleado ( const char fname , const char lname , d Date bd , const struct Address &addr , const char hphone , const char ophone , const char e m a i l , d F l o a t s a l ) : Persona ( fname , lname , bd , addr , hphone ) , o p h o n e ( ophone ) , salary ( sal ) { } email ( email ) , form ; l n a m e ( lname ) , a d d r e s s ( addr )

&
Diseo de Bases de Datos n ODMG-64

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Borrado de instancias
En una base de datos orientada a objetos, un objeto no es borrado de forma expl cita por una aplicacin hasta que no es o borrado de la base de datos. El borrado de un objeto de la cache del cliente es un proceso denominado desactivacin y se tratar en la siguiente seccin. o a o Cuando se borra un objeto se invoca a la funcin destructor si o sta se ha denido. Esta funcin lleva a cabo las operaciones de e o limpieza necesarias para mantener la integridad de los datos, incluyendo operaciones tales como borrar los objetos secundarios gestionados por el objeto. Este proceso se conoce con el nombre de propagacin del o borrado (delete propagation). El estndar ODMG proporciona dos mecanismos de borrado. Los a objetos pueden borrarse usando: El operador C++ delete. El operador delete object denido en la clase d Ref<T>. Los objetos Empleado a los que apuntan emp3 y emp4 pueden eliminarse de la base de datos mediante ambos mecanismos: d Ref<Empleado> empRef ( emp3 ) ; delete emp4 ; empRef . d e l e t e o b j e c t ( ) ; &
Diseo de Bases de Datos n ODMG-65

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Borrado de instancias . . .

Si la aplicacin cuenta con un puntero al objeto que debe o borrarse es posible utilizar el operador delete. El puntero debe estar inicializado con la direccin de memoria del objeto en la o cache de la aplicacin: el objeto debe estar ya en la cache. o Si la aplicacin slo cuenta con una referencia d Ref<T> al o o objeto es posible utilizar la funcin delete object. Cuando se o invoca, el objeto puede estar o no en la cache del sistema. Para ejecutar el destructor, la instancia debe estar activada en la cache. El proceso: Una vez que se ejecuta el destructor, el objeto se elimina de la cache de la aplicacin. o Si la transaccin se valida con xito, el objeto es entonces o e eliminado de la base de datos. Si la transaccin aborta, el objeto permanecer en la base de o a datos as como cualquier otro objeto borrado por el destructor. Las instancias transitorias no se ven afectadas, normalmente, por las actividades de transaccin. o Caracter sticas: o El destructor denido en d Object se dene como una funcin virtual, de modo que se puede utilizar un puntero a la clase base para borrar una instancia de la clase derivada. Por ejemplo: una instancia de d Ref<Persona> puede hacer referencia a una instancia Empleado. La llamada a delete object generar la llamada correcta al destructor de la clase Empleado. a

&

Diseo de Bases de Datos n

ODMG-66

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Borrado de instancias . . .

Consideraciones de rendimiento: Si la clase no cuenta con un destructor y la instancia no se encuentra en la cache de la aplicacin, no es necesario activar el o objeto cuando se borra. De modo similar, algunas implementaciones permiten borrar un objeto sin invocar al destructor. Ambas tcnicas pueden mejorar el rendimiento: en ocasiones es e aceptable obviar el proceso de destruccin y por tanto reducir el o coste de procesado que requiere activar el objeto en la cache. Sin embargo, es responsabilidad de la aplicacin determinar si es o necesario o no realizar algn tipo de proceso especial. u Deciencias: La llamada a los operadores delete y dele object elimina la instancia tanto de la cache de la aplicacin como de la base de o datos. En algunas circunstancias, puede ser conveniente liberar espacio en la memoria cache eliminando algunos objetos de la cache pero no de la base de datos (especialmente en aquellas aplicaciones que operan sobre un conjunto de objetos tan grande que no cabe en la cache). Desgraciadamente, ODMG no proporciona ningn mecanismo u para eliminar objetos de la cache de la aplicacin sin eliminarlos o de la base de datos. Algunas aplicaciones ODBMS proporcionan soluciones propietarias. Una aplicacin puede marcar el objeto como o unpinned, permitiendo que el software de la base de datos lo pase al rea de intercambio (swap). a

&

Diseo de Bases de Datos n

ODMG-67

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Activacin y desactivacin o o
A medida que los objetos son accedidos desde la base de datos por una transaccin son movidos hacia y desde la cache de la aplicacin. o o Estos movimientos se denominan activacin y desactivacin. o o Cuando un objeto es activado, puede ser necesario llevar a cabo algn proceso de inicializacin de los datos transitorios. u o Del mismo modo, cuando un objeto abandona la cache, puede ser necesario realizar algn tipo de operacin de nalizacin. u o o En general, ser necesario asignar memoria dinmica cuando el a a objeto entra en la cache y liberarla cuando la abandona. La desactivacin tendr lugar cuando la transaccin se valida o o a o cuando el objeto es pasado al rea de intercambio (swapped a out). En la gura se ilustra el proceso de activacin y desactivacin de un o o objeto.
Aplicacin
(crea nuevo objeto) constructor

Aplicacin
(accede all objeto) activacin

Aplicacin
(borra el objeto) destructor

desactivacin

desactivacin

activacin

Base de datos Tiempo

&
Diseo de Bases de Datos n ODMG-68

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Las funciones d activate y d deactivate

Las funciones virtuales d activate y d deactivate de la clase d Object son invocadas por el software de la base de datos cuando tienen lugar los eventos de activacin y desactivacin. Cualquier o o funcionalidad que la aplicacin deba realizar sobre los objetos debe o emplazarse en esas funciones. La aplicacin puede requerir algn tipo de proceso cuando se o u activa un objeto, tales como acceder a objetos relacionados o refrescar la interface grca de usuario gestionada por la a aplicacin. Este proceso puede llevarse a cabo en d activate. o Las funciones d activate y d deactivate juegan un papel similar a los constructores y destructores de una clase C++. Estas funciones gestionan cualquier inicializacin de datos o transitorios o cualquier otro tipo de procesado requerido por la aplicacin. o Es importante dejar claro que los atributos persistentes no necesitan ser inicializados, ya que sus valores se almacenan en la base de datos. Sin embargo, puede ser necesario inicializar los parmetros transitorios. a

&
Diseo de Bases de Datos n ODMG-69

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Las funciones d activate y d deactivate . . . Supongamos que el objeto mostrado en la gura anterior es una instancia de la clase Empleado derivada de la clase Persona. Supongamos tambin que hemos denido las funciones virtuales e d activate y d deactivate para dicha clase.

El orden de ejecucin del constructor, destructor, d activate y o d deactivate es como sigue:


Aplicacin 1 comienza o Persona::Persona Empleado::Empleado Empleado::d_deactivate Aplicacin 2 o Empleado::d_activate Empleado::d_deactivate Aplicacin 3 o Empleado::d_activate Empleado::~Empleado Persona::~Persona

La aplicacin crea Empleado o Invocado en tiempo de commit Se accede al objeto Empleado Invocado en tiempo de commit Se accede al objeto Empleado Se borra el objeto

Es interesante notar que: No se llama a las funciones d activate y d deactivate de la clase Persona. El software de la base de datos no llama a cada una de las funciones d activate y d deactivate en la jerarqu de a herencia. Se recomienda que las aplicaciones emulen el comportamiento de los constructores y destructores estndar cuando a implementan d activate y d deactivate. Por tanto, cada funcin d activate de la clase derivada debe o llamar primero a la funcin d activate de la clase base. o

&

Diseo de Bases de Datos n

ODMG-70

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Las funciones d activate y d deactivate . . . Por ejemplo:


void Empleado : : d a c t i v a t e ( ) { Persona : : d a c t i v a t e ( ) ; // activacin espec o ca de Empleado } void Empleado : : d d e a c t i v a t e ( ) { // desactivacin espec o ca de Empleado Persona : : d d e a c t i v a t e ( ) ; }

Exactamente el mismo procedimiento debe llevarse a cabo con las funciones d deactivate. Nota: La funcin d activate no se invoca sobre los objetos cuando se o llama a checkpoint sobre el objeto d Transaction. Cuando se lleva a cabo un checkpoint, el estado de todos los objetos en la cache de la aplicacin se valida en la base de datos, o pero stos permanecen en la cache para futuras manipulaciones. e

&
Diseo de Bases de Datos n ODMG-71

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Modicacin de instancias o

Cuando un objeto es activado en la cache de la aplicacin, el o software de la base de datos le asigna impl citamente un lock, generalmente de slo lectura que permite el acceso compartido. o Si la aplicacin pretende modicar el objeto, debe invocar a la o funcin mark modified antes de la alteracin. o o El estndar ODMG no establece qu sucede cuando la aplicacin a e o modica el objeto antes de invocar a la funcin mark modified. o El comportamiento var entre implementaciones: si no se a invoca primero a la funcin no hay garant de que las o a modicaciones realizadas se escriban en tiempo de commit. Algunas implementaciones utilizan la llamada a mark modified para indicar que se debe activar un lock de escritura. En este caso la llamada puede considerarse una forma expl cita de obtener el lock. Los sistemas con memoria virtual permiten controlar el acceso de lectura/escritura a las pginas de memoria. Algunas a implementaciones emplean esta capacidad para controlar el acceso: Cuando el objeto es accedido por primera vez, la pgina se a proyecta en la memoria de la aplicacin con acceso de slo o o lectura. Si la aplicacin intenta modicar el objeto se produce o un trap a nivel del sistema. El software de la base de datos puede capturar ese trap y actuar activando el lock de escritura para el objeto y cambiando el acceso a la pgina de memoria a lectura-escritura. a Los ODBMSs que utilizan esta tcnica no requieren que la e aplicacin llame a mark modified para activar el lock o apropiadamente. Sin embargo esto no es portable.

&

%
DBD-13019

Diseo de Bases de Datos n

ODMG-72

Universitat de Val`ncia e

Departament dInform`tica a

'

Modicacin de instancias . . . o

Si la tcnica de encapsulado se ha utilizado correctamente, todos los e atributos son private y slo pueden modicarse a travs de las o e operaciones de la clase. Esta aproximacin presenta dos ventajas: o Aquellas operaciones que no modiquen el estado del objeto, pueden declararlo const: el compilador puede forzar la naturaleza de slo lectura de la funcin. o o Las operaciones que modican el estado del objeto deben llamar a la funcin mark modified antes de alterar el atributo. o Una aplicacin coherente de esta tcnica permite que las o e aplicaciones que utilizan la clase no necesiten llamar directamente a la funcin mark modified. o
void Persona : : newAddress ( struct Address &addr ) { mark modifed ( ) ; a d d r e s s = addr ; }

Cuando se invoca a mark modified, la implementacin de la o base de datos asegura que si la transaccin se valida con xito, o e los valores de las instancias modicadas se almacenan correctamente. La implementacin normalmente mantiene un ag, denominado o dirty bit, para marcar qu ha sido modicado (la granularidad e del ODBMS puede ser mayor que una instancia individual). La base de datos conoce qu instancias han sido modicadas y e es capaz de escribir en la base de datos los objetos modicados. La aplicacin no necesita propagar las modicaciones en la base o de datos.

&

Diseo de Bases de Datos n

ODMG-73

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Modicacin de instancias . . . o

Esta tcnica supone un gran abaratamiento de los costes de e desarrollo. Las aplicaciones que utilizan otras tecnolog de bases as de datos deben propagar expl citamente el estado de todos los objetos modicados en la base de datos: La aplicacin debe saber qu objetos han sido modicados. o e Debe contar con el software apropiado para que cada clase escriba sus instancias en la base de datos.

&
Diseo de Bases de Datos n ODMG-74

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Comparacin con el modelo relacional o

1. En una base de datos relacional, una entidad en el modelo se materializa en una tabla, que se dene mediante la sentencia create table de SQL. Los atributos de la entidad se representan mediante columnas en la tabla y el nombre y tipo de cada columna se dene en la sentencia create table. Las instancias de la entidad son las las de la tabla. 2. Las relaciones de herencia entre entidades no pueden declararse entre tablas. Las aplicaciones pueden disear y gestionar n relaciones de herencia por encima del modelo relacional, pero la base de datos desconoce que stas existen. e 3. La base de datos relacional no proporciona un interface para proyectar las clases entre la base de datos y la representacin o C++. Todos los accesos a la base de datos, tanto en lectura como en escritura, se realizan en trminos de columnas. e 4. En una base de datos orientada a objetos, la aplicacin accede o necesariamente a todos los atributos de una clase, ya que no es posible acceder a slo un subconjunto de los atributos. En la o base de datos relacional lo fcil y natural es acceder a slo un a o subconjunto de los atributos. 5. Una base de datos relacional desconoce las instancias utilizadas por la aplicacin y no proporciona un mecanismo de cache para o la aplicacin. La aplicacin es responsable de determinar o o qu objetos es necesario escribir en la base de datos. El e desarrollador de la aplicacin debe tomar un gran nmero de o u decisiones acerca de como gestionar la propagacin de las o modicaciones en la base de datos y escribir el software correspondiente. En una base de datos orientada a objetos este tipo de cosas se gestionan automticamente reduciendo a substancialmente el costo de desarrollo. &
Diseo de Bases de Datos n ODMG-75

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Comparacin con el modelo relacional . . . o

6. Las bases de datos relacionales no soportan encapsulado a nivel de aplicacin, ya que desconocen el modelo de objetos utilizado o por la aplicacin. Mediante SQL, todos los atributos (columnas) o son directamente accesibles. Si se requiere control de acceso, es necesario utilizar views para limitar el nmero de columnas u accesibles. Las views proporcionan un cierto grado de ocultacin o de informacin en una base de datos relacional, pero existen o algunas restricciones importantes: en general no es posible actualizar las columnas de una view. 7. Las columnas de una la son modicadas directamente mediante el comando update de SQL. Algunas bases de datos relacionales permiten especicar restricciones para mantener la integridad semntica, que son comprobadas en el momento de la validacin a o para asegurar que los cambios dejan a la entidad en un estado lgico consistente. La aplicacin primero hace los cambios y o o despus se validan en la etapa de commit. Esta aproximacin e o diere substancialmente de la utilizada en una base de datos orientada a objetos, en donde la aplicacin dene expl o citamente qu operaciones son vlidas. Slo el diseador e implementador e a o n de la clase puede alterar los atributos directamente. Esta estructura conduce a un gran nivel de integridad de los datos.

&
Diseo de Bases de Datos n ODMG-76

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Identicacin de objetos o

La tcnica primaria para identicar un objeto en una base datos e orientada a objetos es el identicador de objeto (OID). Otra posibilidad consiste en asignarle un nombre, consistente en una cadena de caracteres ASCII, con un valor determinado por la aplicacin. La aplicacin puede entonces acceder al objeto o o mediante el nombre. Uno o ms atributos de la clase pueden utilizarse como clave a para localizar el objeto. Una aplicacin puede especicar que o quiere acceder al conjunto de todos los objetos que tienen atributos cuyos valores cumplen una determinada condicin o (query). Muchos objetos reproducen cosas que existen en el mundo real, algunas de las cuales pueden contar con un identicador propio y diferente del OID. En una base de datos orientada a objetos es posible denir nombres o claves y establecer una relacin con el o identicador real del objeto en la base de datos.

&
Diseo de Bases de Datos n ODMG-77

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Identicador de objeto

El mecanismo fundamental para identicar un objeto es v su a identicador de objeto (OID). La base de datos asigna un OID unico a cada instancia cuando sta se crea por primera vez. e El OID no es un atributo de la instancia y su valor no puede ser cambiado por una aplicacin. o Es la implementacin de la base de datos la responsable de o generar OIDs unicos. Sin embargo, los OIDs son unicos slo en un mbito dado o a (normalmente la base de datos). Ya que el ODMG proporciona acceso a una unica base de datos, el OID debe ser unico dentro de la base de datos. Determinadas implementaciones ampl este mbito. an a En ODMG: Se utiliza una instancia de la clase d Ref<T> para referenciar una instancia de la clase T, que debe derivar de la clase base d Object. Esta instancia puede tambin referenciar ha instancias de e cualquier clase pblica derivada de T. u Cuando las instancias de d Ref<T> se almacenan en la base de datos, contienen el OID del objeto referenciado. Cuando una instancia d Ref<T> est en memoria, su valor puede a ser un OID o una direccin de memoria de la cache que contiene o el identicador. Las aplicaciones no pueden acceder a la representacin real del o identicador, que var signicativamente entre proveedores. a &
Diseo de Bases de Datos n ODMG-78

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Identicador de objeto . . .

El siguiente cdigo muestra cmo declarar una referencia a dos o o instancias de Persona y Empleado:
d Ref <Persona> d Ref <Empleado> persona ; emp ;

Una instancia de la clase d Ref Any puede contener una referencia a una instancia de cualquier clase derivada de d Object:
d Ref Any apersona ;

Con un d Ref Any slo es posible llevar a cabo un subconjunto o de las operaciones que se pueden realizar con un d Ref<T>. Es posible convertir una referencia d Ref Any a d Ref<T>. Cuando la conversin naliza es necesario realizar o comprobaciones de tipo en tiempo de ejecucin para asegurar o que el objeto es una instancia de la clase T o derivada de T. Ambas clases proporcionan punteros inteligentes (smart pointers) cuya semntica es similar a la de los punteros, ya que es posible a utilizar los operadores de derreferencia -> y *. Un referencia d Ref<T> admite herencia y polimorsmo del mismo modo que un puntero C++. Supongamos que una clase D deriva de la clase B. Un d Ref<B> puede referenciar a una instancia de cualquier clase derivada de B, incluyendo a D. La instancia se puede referenciar independientemente de su tipo real, de modo que es posible utilizar referencias polimrcas en o la base de datos.

&

Diseo de Bases de Datos n

ODMG-79

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Identicador de objeto . . .

El siguiente cdigo crea una instancia de Empleado: o


d Database db ; // Apunta a una db abierta d Ref <Persona> p e r s o n a = new(&db , Empleado ) Empleado ( Juan , L pez ) ; o

La variable persona contiene una referencia a una instancia de Empleado: Como cuando se utilizan punteros, las aplicacin slo puede o o acceder a los atributos de Persona. Sin embargo, es posible llamar a las funciones virtuales empleando la variable persona y se invocar la funcin correcta a o de la clase Empleado. La derreferencia es una de las operaciones fundamentales en una base de datos orientada a objetos. Para realizar esta operacin se o utilizan los operadores -> y * denidos en d Ref<T>:
pe rs ona> l n a m e ( ) ; ( persona ) . f name ( ) ; // usado ms frecuentemente a

El operador -> devuelve la direccin del objeto en la cache de la o aplicacin. o El operador * devuelve una referencia C++ al objeto. Si el objeto referenciado ya se encuentra en la aplicacin, estos o operadores simplemente devuelven un puntero al objeto. Si el objeto no se encuentra en memoria, se recupera de la base de datos y se coloca en memoria.

&

Diseo de Bases de Datos n

ODMG-80

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Inicializacin y asignacin o o

Hay varias formas de inicializar una instancia de d Ref<T> o d Ref Any. El constructor nulo inicializa la referencia a un valor nulo. Las siguientes declaraciones de d Ref<T> son vlidas: a
d Ref <Persona> Persona d Ref <Empleado> Empleado d Ref Any d Ref <Persona> d Ref <Persona> d Ref <Persona> d Ref <Persona> d Ref <Persona> persona ; p = 0 ; empleado ; e = 0; any ; p1 ( p e r s o n a ) ; p2 ( p ) ; p3 ( empleado ) ; p4 ( e ) ; p5 ( any ) ; // Requiere comprobacin o // de tipo en tiempo de // ejecucin o

Algunas inicializaciones y asignaciones no son vlidas debido a las a relaciones de herencia entre clases. Por ejemplo:
d Ref <Departamento> Departamento depto ; d = 0 ;

// Las clases Departamento y Empleado // no estn relacionadas a depto = empleado ; empleado = d ; // ilegal // ilegal

// Empleado deriva de Persona, una referencia a // una clase derivada no puede apuntar a un // objeto de la clase base empleado = p e r s o n a ; // ilegal

&

%
DBD-13019

Diseo de Bases de Datos n

ODMG-81

Universitat de Val`ncia e

Departament dInform`tica a

'

empleado = p ;

// ilegal

Si tiene lugar una inicializacin o asignacin invlida se produce una o o a excepcin d Error TypeInvalid. o

&
Diseo de Bases de Datos n ODMG-82

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Referencias nulas Una referencia puede contener un valor nulo. Las clases d Ref<T> y d Ref Any cuentan con un constructor nulo que inicializa las referencias a un valor nulo. Adicionalmente, la funcin clear se puede emplear para poner o un valor nulo en la referencia. Existen varias formas de determinar cuando una referencia contiene un valor nulo. La funcin booleana is null devuelve true (no cero) si la o referencia es nula y false (cero) en caso contrario. El operador ! devuelve true si la referencia es nula. El siguiente ejemplo muestra el uso de estas funciones:
d Ref<Empleado> emp ;

i f ( emp . i s n u l l ( ) ) . . . i f ( ! emp ) . . . i f ( emp == 0 ) . . .

&
Diseo de Bases de Datos n ODMG-83

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones de derreferencia Las operaciones de derreferencia se utilizan para acceder a un objeto a travs de una referencia. e La conversin de una referencia de la base de datos a un puntero o se denomina swizzling. Las funciones -> y ptr llevan a cabo el proceso de swizzling y devuelven un puntero a la instancia referenciada. El operador * tambin lleva a cabo el swizzling y devuelve una e referencia C++ a la instancia. Estos operadores permiten que la clase d Ref<T> cuente con una interface con sintxis y semntica muy similar a la de un a a puntero.
void r e f e r r a l ( const Persona &); d Ref<Persona> d Ref<Empleado> Persona persona ; emp ; p ;

pe rs ona> l n a m e ( ) ; r e f e r r a l ( persona ) ; r e f e r r a l ( emp ) ; p = persona . ptr ( ) ; p = emp . p t r ( ) ; // direccin en la cache o // referencia C++ al objeto

Para acceder de forma expl cita a la direccin de un objeto en la o cache, es necesario invocar la funcin ptr. o -> se utiliza para acceder a un miembro del objeto y * cuando se requiere una referencia. & Es conveniente comprobar primero si la instancia es nula. %
DBD-13019

Diseo de Bases de Datos n

ODMG-84

Universitat de Val`ncia e

Departament dInform`tica a

'

Derreferenciar un d Ref<T> nulo genera una excepcin o d Error RefNull.

&
Diseo de Bases de Datos n ODMG-85

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Copia de referencias

La operacin de copia de constructores d Ref<T> y d Ref Any lleva o a cabo una copia supercial similar a la de los punteros C++.
c l a s s Foo : public d O b j e c t { in t d Ref<Bar> public : Foo ( const d Ref<Bar> &); // Supongamos que no existe el // constructor copy }; x; bar ;

// Otros atributos

Si la aplicacin no dene un operador de copia, el compilador o genera una que inicializa miembro a miembro. Cuando se inicializa una instancia Foo con otra instancia Foo, ambas hacen referencia a la misma instancia Bar:
d Database db ; // db abierta d Ref<Bar> d Ref<Foo> d Ref<Foo> b = new(&db , Bar ) Bar ( ) ; f o o = new(&db , Foo ) Foo ( b ) ; newFoo = new(&db , Foo ) Foo ( f o o ) ;

Para aplicar la operacin al objeto referenciado por d Ref<T>, la o aplicacin debe especicar la funcionalidad expl o citamente:
Foo : : Foo ( const Foo &f ) : x ( f . x ) { bar = new(&db , Bar ) Bar ( f . bar ) ; // Otras inicializaciones }

&

%
ODMG-86 DBD-13019

Diseo de Bases de Datos n

Universitat de Val`ncia e

Departament dInform`tica a

'

Mediante el constructor de copia para Foo, las dos instancias harn referencia a diferentes instancias de Bar. Esta tcnica se a e conoce como inicializacin profunda. o

&
Diseo de Bases de Datos n ODMG-87

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Igualdad y desigualdad Los operadores de igualdad y desigualdad (== y !=) estn denidos a para ambas clase d Ref<T> y d Ref Any. El operador == denido para d Ref<T> puede utilizarse para comparar una referencia de la base de datos con una referencia nula:
d Ref<Empleado> nullEmp ;

i f ( emp == nullEmp ) . . . while ( emp != nullEmp ) { . . . }

La operacin de igualdad es supercial, slo se comparan los o o identicadores de objetos y no los objetos referenciados. Esto se denomina identidad. La denicin del operador == para las clases Foo y Bar del o ejemplo anterior se pueden hacer: 1. Basndose en el valor de Bar (ambos bar reeren a la misma a instancia):
in t operator==(const Foo &f , const Foo &g ) { // Igualdad supercial (identidad) return f . x == g . x && f . bar == g . bar ; }

2. En funcin de los valores referenciados por bar: o


in t operator==(const Foo &f , const Foo &g ) { // Igualdad profunda return f . x == g . x && f . bar == g . bar ; }

&

%
ODMG-88 DBD-13019

Diseo de Bases de Datos n

Universitat de Val`ncia e

Departament dInform`tica a

'

El desarrollador de la aplicacin es quien debe determinar cual o es la operacin apropiada. o

&
Diseo de Bases de Datos n ODMG-89

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Denominacin de objetos o

Es posible asociar un nombre a un objeto de la base de datos que consiste en una cadena de caracteres ASCII con un valor determinado por la aplicacin. o El nombre debe ser unico en la base de datos y proporciona al usuario una forma de identicar el objeto. No es obligatorio que todas las instancias de una clase cuenten con un nombre; es la aplicacin quien decide qu objetos deben o e nombrarse. El nombre puede ser un valor arbitrario, pero es recomendable establecer una pol tica de asignacin de nombres que se ajuste a o las necesidades de la aplicacin. o Slo un pequeo grupo de objetos de la base de datos tienen o n nombre. Una vez que se accede al objeto inicial mediante nombre, se recorre la estructura de referencias para acceder a los objetos adicionales. El objeto con nombre se denomina objeto ra (root object) o z entry point object por su papel como punto de acceso a los objetos relacionados. La especicacin ODMG presenta algunas limitaciones en la o asignacin de nombres: o El ODMG proporciona un unico espacio de nombres por base de datos. Si un nombre ya en uso y se intenta asignar a otro objeto se produce una excepcin d Error NameNotUnique. o En el ODMG-93 1.2, un objeto slo puede tener un nombre. Si o se pone nombre a un objeto que ya lo tiene, el nuevo nombre reemplaza al anterior. En ODMG 2.0 puede tener mltiples u nombres.

&

Diseo de Bases de Datos n

ODMG-90

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Denominacin de objetos . . . o

La funcin set object name de d Database asocia un nombre o con un objeto. Para borrar el nombre (o los nombres) de un objeto, basta con invocar la funcin set object name con el argumento 0. o En ODMG 2.0 se aade la funcin rename object para n o renombrar un objeto, pasando como argumentos el antiguo nombre y el nuevo. Para eliminar uno de los varios nombres que puede tener un objeto en ODMG 2.0 basta con invocar a la funcin o rename object utilizando 0 como segundo argumento. El lenguaje de consulta orientado a objetos, OQL (Object Query Language) permite la utilizacin de nombres para acceder a los o objetos: con el n de facilitar el uso de nombre en OQL, el nombre debe utilizar slo caracteres alfanumricos. o e Convertir los espacios en caracteres es una tcnica para manejar e nombres compuestos.
d Ref <Departamento> createDBDepto ( const char name , const char f a x ) { d Ref<Departamento> depto ; const char oname = createDBname ( name ) ; depto = new(&db , Departamento ) Departamento ( name , f a x ) ; db . s e t o b j e c t n a m e ( depto , oname ) ; delete oname ; return depto ; }

&
Diseo de Bases de Datos n ODMG-91

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Denominacin de objetos . . . o

La clase d Database cuenta con la funcin lookup object para o obtener un d Ref Any a partir de una cadena ASCII . Si no existe ningn objeto con el nombre especicado, la funcin u o retorna un d Ref Any nulo. El siguiente cdigo se utiliza para acceder a una instancia o Departamento a travs de su nombre dname: e
const char oname = createDBname ( dname ) ; d Ref <Departamento> depto = db . l o o k u p o b j e c t ( oname ) ; delete oname ;

Si en la base de datos existe un objeto con el nombre oname pero el objeto no es de la clase Departamento o de una clase derivada de sta, se produce una excepcin d Error TypeInvalid. e o Por tanto, el sistema lleva a cabo comprobaciones de tipo en tiempo de ejecucin. o

&
Diseo de Bases de Datos n ODMG-92

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones

Las colecciones se utilizan para denir un conjunto de valores de algn tipo. u Son indispensables en el diseo de objetos y desarrollan muchos n papeles en la tecnolog de bases de datos orientadas a objetos. a Son parte constituyente de los fundamentos sobre los que se dene el modelo de objetos de la aplicacin y se utilizan para o representar las relaciones entre los objetos de la base de datos. Constituyen tambin el valor retornado como resultado de una e consulta a la base de datos. Existen varios tipos de colecciones, cada una con sus caracter sticas propias. Las colecciones dieren en el tratamiento de los valores duplicados, orden de los elementos, acceso y capacidades de iteracin. o Las colecciones ms comunes son los sets, bags, lists, arrays y a dictionaries.

&
Diseo de Bases de Datos n ODMG-93

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones . . .

Son varias las operaciones denidas que operan sobre colecciones: Insertar y eliminar elementos son las ms comunes. a Algunas colecciones proporcionan operaciones para determinar si un valor espec co es un elemento de la coleccin. o Cada instancia coleccin cuenta con un atributo de o cardinalidad, que es el nmero de elementos que contiene. u Los objetos iterators se emplean para iterar sobre los elementos de una coleccin. o Dependiendo del tipo de coleccin, el iterador puede soportar o acceso a los elementos en orden directo, inverso o aleatorio. Cuando el iterador se asocia a una coleccin referencia al o elemento actual o se encuentra en el estado n de iteracin. o Ya que las colecciones y los iteradores operan sobre tipos denidos por el usuario, emplean la capacidad template de C++.

&
Diseo de Bases de Datos n ODMG-94

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones e iteradores en ODMG Todas las clases de coleccin del ODMG derivan de la clase base o d Collection<T>. Las operaciones soportadas por todas las colecciones se denen en dicha clase base. En la tabla se muestran algunas caracter sticas de las colecciones ODMG: Coleccin o d Set<T> d Dictionary<K,V> d Bag<T> d List<T> d Varray<T> Ordenada No No No Si Si Permite duplicados No No Si Si Si

En la gura se representan las relaciones de herencia entre las colecciones. La clase iterador d Iterator<T> se dene en la interface ODMG y es utilizada por todas las clases de coleccin. o
K,V d_multimap d_Object K,V d_map

T d_set d_multiset

T d_list

T d_vector

T d_Collection d_Iterator

T d_Set d_Bag

K,V d_Dictionary d_List

T d_Varray

&
Diseo de Bases de Datos n ODMG-95

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones e iteradores en ODMG . . . La clase base d Collection<T> deriva de d Object de modo que una coleccin puede ser un objeto independiente y o persistente en la base de datos. Una coleccin persistente tiene un identicador de objeto y o puede referenciarse en la base de datos. Puede tambin embeberse como un atributo de una clase e persistente, pero en estas circunstancias funciona como un dominio, carece de OID y no puede ser referenciada directamente. El ODMG 2.0 da soporte a un subconjunto de las colecciones del STL (Standar Template Library). Estas colecciones derivan tambin e de la clase d Object y pueden ser persistentes. Esto es aplicable a las siguientes colecciones: d set<T>. d multiset<T> (similar a un bag). d vector<T> (similar a un array). d list<T>. d map<K,V>. d multimap<K,V>.

&
Diseo de Bases de Datos n ODMG-96

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Sets La clase plantilla o patrn d Set<T> del ODMG representa a un o conjunto de elementos del tipo T. Un set es una coleccin desordenada de elementos sin o duplicacin. o Cuando se inserta un valor en un set, la implementacin debe o determinar si el valor es ya un elemento del set (algo en lo que es muy eciente). El set debe tambin ser capaz de determinar si dos valores son e iguales. Esto ultimo implica que el operador igualdad debe estar denido para el elemento y ser accesible por la implementacin de set. o Bags Un bag es una coleccin desordenada que permite la repeticin de o o valores. Lists Una list es una coleccin ordenada de valores en los que se permite o la duplicacin. o Cada elemento de la lista tiene un ndice que determina su posicin relativa. o Proporciona operaciones para insertar nuevos elementos en posiciones determinadas de la lista. Est disponible una operacin de indizacin para acceder al a o o elemento en la i-sima posicin. o &
Diseo de Bases de Datos n ODMG-97

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Arrays El ODMG dene la clase d Varray<T> que implementa vectores de longitud variable. Tambin proporciona una operacin de indizacin para acceder e o o al i-simo elemento, aunque generalmente de forma mucho ms a eciente que una list Sin embargo, el list es ms eciente en la insercin y eliminacin a o o de elementos).

Dictionaries Otro tipo de coleccin que las aplicaciones encuentran generalmente o util es el dictionary (tambin llamado vector asociativo). e La clase d Dictionary<K,V> se introdujo en el ODMG 2.0. Un diccionario establece una relacin entre una clave de un o determinado tipo y un valor de otro tipo. Debido a que la implementacin puede soportar o no la o repeticin de claves, los diccionarios se construyen normalmente o empleando tcnicas de hashing o estructuras de datos que sacan e partido de la ordenacin de las claves. o Por este motivo, el tipo de la clave debe proporcionar una funcin de hash o una funcin para comparar los valores de sus o o instancias. Algunos diccionarios mantienen sus claves ordenadas, permitiendo la iteracin ordenada. o El tipo de diccionario que comnmente se encuentra en los u modelos orientados a objetos cuenta con una clave de tipo cadena de caracteres que se emplea para localizar un valor de cualquier otro tipo (generalmente la referencia a un objeto).

&

Diseo de Bases de Datos n

ODMG-98

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Tipo de los elementos de una coleccin o Los elementos de una coleccin pueden ser de cualquier tipo, aunque o dependiendo de la implementacin pueden existir algunas o limitaciones.

Cada tipo T usado como elemento de una coleccin debe soportar las o siguientes operaciones:
class T { public : T( ) ; T( const T &); T ( ) ; T }; &operator=(const T &); friend in t operator==(const T &, const T &);

Es importante que la implementacin de estas funciones sea lo o ms eciente posible, ya que tienen un impacto directo en el rena dimiento de la coleccin que contiene el tipo. o

&
Diseo de Bases de Datos n ODMG-99

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones comunes sobre colecciones

Gestin de los elementos de la coleccin o o La funcin cardinality determina el nmero de elementos de o u una coleccin. o La funcin contains element determina si un valor se o encuentra en la coleccin. La clase T debe proporcionar un o operador ==. La funcin insert element inserta un valor en la coleccin. o o Si la coleccin es un d Set<T> que ya contiene ese valor, no o se aade el elemento. n Como las clases d Bag<T> y d Set<T> son colecciones sin orden, el nuevo elemento se inserta en cualquier posicin. o En una coleccin de la clase d List<T> el nuevo elemento se o inserta al nal de la lista. De modo similar, en una coleccin de la clase d Varray<T>, o el tamao del vector se incrementa en una unidad y el nuevo n elemento se inserta en la ultima posicin. o La funcin remove element elimina un elemento con el valor o especicado. Las clases d Bag<T>, d List<T> y d Varray<T> admiten duplicacin: el elemento que se borra es el primero al que se o accede en la iteracin. o Cuando se elimina un elemento del tipo T se invoca al destructor correspondiente. o Si el elemento es de tipo d Ref<T>, slo se invoca al destructor de esta clase y no al destructor de la clase T. Es la aplicacin quien debe eliminar el objeto T si es necesario. o La funcin remove all elimina todos los elementos o todos o aquellos elementos con un determinado valor. &
Diseo de Bases de Datos n ODMG-100

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Gestin de los elementos de la coleccin . . . o o Notas: Cuando se modica una coleccin, se invoca automticamente a o a mark modifed. Esto es vlido para las operaciones insert element y a remove element. Esto puede afectar a la concurrencia. Copia y asignacin de colecciones o El constructor nulo inicializa la coleccin con cero elementos. El o destructor elimina el objeto coleccin e invoca al destructor de o cada elemento. El constructor copia inicializa una nueva coleccin utilizando la o coleccin que se pasa como argumento. o Cada elemento de tipo T se copia a partir de la coleccin o existente invocando al constructor copia de dicha clase. Es importante destacar que si el elemento es de tipo d Ref<T>, ambas colecciones se referirn a la misma a instancia T. Si la coleccin no est ordenada, la iteracin sobre las o a o colecciones puede acceder a los elementos en orden diferente. En las colecciones ordenadas se preserva el orden.

Notas: El proceso de copia y asignacin puede ser un proceso costoso, o especialmente si colecciones son grandes. El rendimiento depende tambin de la eciencia de las e operaciones de inicializacin, copia y destruccin (ya que se o o invocan sobre cada elemento).

&

Diseo de Bases de Datos n

ODMG-101

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Comparacin de colecciones o Los operadores de igualdad y desigualdad (== y !=) se denen en la clase base d Collection<T>. Su semntica depende del tipo de coleccin que se a o est comparando. a Ambas colecciones deben tener el mismo tipo de elementos, pero el tipo de coleccin puede ser diferente. Por ejemplo, es posible o comparar la igualdad de dos colecciones d List<T> y d Set<T>. Dos colecciones no pueden ser iguales si tienen cardinalidad diferente: esta es la primera comprobacin que se realiza. o Cuando una coleccin ordenada (d List o d Varray) se o compara con una coleccin desordenada (d Set o d Bag), ambas o colecciones se tratan como desordenadas. Sin embargo, cuando se comparan colecciones ordenadas, el orden tiene importancia.

&
Diseo de Bases de Datos n ODMG-102

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Comparacin de colecciones . . . o Algunas particularidades: Dos instancias d Set<T>, A y B, son iguales si tienen la misma cardinalidad y si cada elemento de A es igual a un elemento de B. Las colecciones del tipo d Bag<T>, d List<T> y d Varray<T> permiten duplicacin de elementos. Cuando una instancia B de o alguna de estas clases se compara con una instancia A de d Set<T>, si B contiene algn duplicado entonces ambas u colecciones son diferentes. Dos instancias A y B del tipo d Bag<T> son iguales si tienen la misma cardinalidad y si B tienen el mismo nmero de u ocurrencias para cada elemento unico de A. Cuando una instancia A del tipo d Bag<T> se compara con una coleccin del tipo d List<T> o d Varray<T>, A y B deben contar o con el mismo nmero de ocurrencias para cada valor unico de A. u Ya que A carece de orden, el orden de los elementos de B no afecta a la operacin. o Cuando se comparan instancias A y B del tipo d List<T> o o d Varray<T>, ambas instancias son iguales slo si tienen la misma cardinalidad y si los elementos en cada posicin de A son o iguales a B.

&
Diseo de Bases de Datos n ODMG-103

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Iteracin o

La clase d Iterator<T> del ODMG se utiliza para iterar sobre todos los tipos de coleccin. o A partir de la versin 1.2 del ODMG-93, la clase d Iterator<T> o soporta la especicacin STL para un iterador bidireccional o constante. Un iterador constante no permite la modicacin o directa de los elementos de la coleccin. o Se soportan los dos operadores incremento (++) y decremento (--), tanto en su forma prejo como sujo para permitir la iteracin hacia adelante y hacia atrs (forward y backward). o a Sin embargo, las clases d Set<T> y d Bag<T> no permiten la iteracin backwards, generando una interrupcin del tipo o o d Error IteratorNotBackward. Son posibles varios estilos de iteracin o

&
Diseo de Bases de Datos n ODMG-104

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Iteracin . . . o
Ejemplo A:
void Departamento : : p r i n t P r o j e c t ( ostream &os ) { d Ref<Proyecto > d I t e r a t o r <d Ref<Proyecto >> proj ; pi ;

for ( pi = proyectos . c r e a t e i t e r a t o r ( ) ; pi . not done ( ) ; p i . advance ( ) ) { proj = pi . get element ( ) ; os << p r o j >name << e n d l ; } }

La funcin create iterator devuelve un iterador posicionado o en el primer elemento. La funcin advance posiciona el iterador en el siguiente o elemento. La funcin not done devuelve true si la iteracin no es o o completa. La funcin get element accede al elemento actual de o la iteracin. o

&
Diseo de Bases de Datos n ODMG-105

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Iteracin . . . o

Ejemplo B:
void Departamento : : p r i n t P r o j e c t ( ostream &os ) { d Ref<Proyecto > d I t e r a t o r <d Ref<Proyecto >> proj ; pi ;

pi = projectos . c r e a t e i t e r a t o r ( ) ; while ( p i . ne xt ( p r o j ) ) { os << p r o j >name << e n d l ; } }

La funcin next de d Iterator<T> derreferencia el iterador, o avanza y comprueba el nal de la iteracin en una unica o llamada. Devuelve, v un parmetro de referencia, el valor del elemento a a que era actual antes de la llamada a next. Notas: Las funciones get element y next no deben utilizarse simultneamente. a Tras la llamada a next, el iterador se posiciona en el siguiente elemento. Dentro del bucle while, el argumento proj se utiliza para referenciar el elemento actual de la iteracin. Si se efecta una o u llamada a get element o al operador * dentro del bucle, el elemento que se devuelve es el siguiente al devuelto por la funcin next. o

&

Diseo de Bases de Datos n

ODMG-106

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Cuando la iteracin alcanza al ultimo elemento, de produce una o excepcin d Error IteratorExhausted. o

&
Diseo de Bases de Datos n ODMG-107

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Iteracin . . . o
Ejemplo C: Las siguientes implementaciones de la funcin printProject o utilizan el estilo de iteracin de la STL. o
void Departamento : : p r i n t P r o j e c t ( ostream &os ) { d I t e r a t o r <d Ref<Proyecto >> d I t e r a t o r <d Ref<Proyecto >> pi ; pe ;

f o r ( p i = p r o j e c t o s . b e g i n ( ) , pe = p r o j e c t o s . end ( ) ; p i != pe ; ++p i ) { os << ( p i )>name << e n d l ; } }

La funcin begin denida en d Collection<T> devuelve un o iterador posicionado en el primer elemento de la coleccin. o La funcin end devuelve un iterador posicionado detrs del o a ultimo elemento. Las funciones begin y end se aadieron a la clase n d Collection<T> por compatibilidad con la STL. El operador de derreferencia * se redene en d Iterator<T> para que acceda al elemento actual de la iteracin. o &
Diseo de Bases de Datos n ODMG-108

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Iteracin . . . o
Ejemplo D: El ultimo estilo de iteracin utiliza el algoritmo STL for each. o Este algoritmo itera desde un iterador posicionado en el primer elemento hasta que se alcanza un segundo iterador que indica el n de iteracin. o Cada elemento obtenido durante la iteracin es pasado como o argumento a la funcin especicada en la llamada for each. o

void printName ( d Ref<Proyecto > p r o j ) { c out << p r o j >name << e n d l ; } void Departamento : : p r i n t P r o j e c t s ( ostream &os ) { f o r e a c h ( proyectos . begin ( ) , p r o y e c t o s . end ( ) , printName ) }

&
Diseo de Bases de Datos n ODMG-109

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones espec cas del tipo de coleccin o

Subsets y Supersets Un conjunto A es un subconjunto de B si cada elemento de A est tambin en B. a e El conjunto A puede ser un subconjunto de B y simultneamente a igual a B (A = B). En ese caso, se dice que B es un superconjunto (superset) de A. Si A no es igual a B, entonces se dice que A es un subconjunto propio (proper subset) de B y que ste es un superconjunto e propio (proper superset) de A. La clase d Set<T> proporciona operaciones para determinar si un conjunto es un subconjunto o superconjunto (propios) de otro conjunto dado: d Boolean is subset of(const d Set<T>&) const d Boolean is proper subset of(const d Set<T>&) const d Boolean is superset of(const d Set<T>&) const d Boolean is proper superset of(const d Set<T>&) const

&
Diseo de Bases de Datos n ODMG-110

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Operaciones de set Las clases d Set<T> y d Bag<T> soportan las siguientes operaciones de conjuntos: Unin +. La unin de los conjuntos A y B es el conjunto de todos o o los valores que estn bien en A, bien en B. Como los sets no a admiten duplicacin, la unin de los conjuntos contiene slo un o o o elemento de cada valor de A o B. En el caso de bags, el nmero u de elementos de la unin es la suma de los elementos de A y B. o Interseccin *. La interseccin de dos conjuntos A y B es un o o conjunto que contiene los valores de estn simultneamente en A a a y en B. Si los conjuntos no tienen elementos comunes, se dice que son disjuntos. Si A y B son bags, el nmero de elementos de un u determinado valor v en el conjunto interseccin es el m o nimo del nmero de elementos v en A o B. Por ejemplo, si A y B son bags u de enteros y el nmero 7 se repite dos veces en A y cinco en B, el u conjunto interseccin slo tendr dos elementos con el nmero 7. o o a u Diferencia -. La diferencia entre los conjuntos A y B (A-B) es el conjunto de los valores de A que no estn en B. Esta operacin a o tambin se denomina complemento de A en relacin a B. En el e o caso de bags, para cada valor v en A, el nmero de valores de v u en A-B es el nmero de valores de v en A menos el nmero de u u valores de v en B. Por ejemplo, sea A = { 1,2,2,2,3,3 } y B = { 1,2,2,3,3,3,4 }, el conjunto A-B es { 2 }. Las operaciones descritas se aplican entre clases del mismo tipo. Si un aplicacin necesita llevar a cabo estas operaciones entre una o instancia de la clase d Set<T> y otra de la clase d Bag<T>, la instancia d Set<T> debe convertirse previamente en un bag. &
Diseo de Bases de Datos n ODMG-111

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Operaciones d List<T> y d Varray<T> Las clases d List<T> y d Varray<T> soportan acceso indexado a sus elementos. El valor del primer ndice es 0, siguiendo el convenio usado en C y en C++. Es posible establecer el tamao de una instancia unidimensional n o n de d Varray<T> en su inicializacin o pasando el nuevo tamao a la funcin resize. o El tamao actual de un vector se puede obtener mediante una n llamada a la funcin cardinality. o Existen funciones para recuperar, reemplazar y eliminar elementos en una posicin determinada. Si el o ndice est fuera de a rango, se produce una excepcin d Error PositionOutOfRange. o La funcin insert element, heredada de la clase base o o d Collection, inserta el nuevo elemento al nal de la coleccin. La coleccin d List<T> proporciona funciones para insertar un o elemento en la primera o ultima posicin de la lista y antes o o despus de un determinado elemento. e La coleccin d List<T> tambin proporciona funciones para o e combinar los elementos de dos listas. La denicin de estas o funciones var dependiendo de si se modica la lista original o a de si se crea una nueva lista. Las funciones concat y + crean una nueva lista que contiene los elementos del operando izquierdo seguidos por los del operando derecho. Las funciones append y += aaden los elementos del operando n al nal de la lista original. Esta funciones son ms ecientes, a ya que el resultado se aplica sobre el objeto que las invoca. &
Diseo de Bases de Datos n ODMG-112

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones con nombre y extents

Es frecuente que una aplicacin tenga que acceder a todas las o instancias de una determinada clase. Existen dos mtodos e fundamentales para este propsito. o La especicacin ODMG-93 1.2 requiere la utilizacin de una o o coleccin con nombre que contiene una referencia a cada o instancia. El nombre de la coleccin es arbitrario, pero la o aplicacin es responsable de mantener la coleccin: cada vez que o o se crea o destruye una instancia es necesario modicar la coleccin. o El conjunto de todas las instancias persistentes de una clase se denomina su extent (literalmente extensin). Cuando una o transaccin crea o borra instancias, los cambios se reejan o automticamente en el extent asociado. Los extents son a soportados desde la versin ODMG 2.0. o Colecciones con nombre El mantenimiento de una coleccin con nombre puede gestionarse o mediante los constructores y destructores de la clase.

&
Diseo de Bases de Datos n ODMG-113

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones con nombre . . . Una coleccin denominada Deptos se utiliza para contener una o referencia a cada instancia de Departamento:
c l a s s Departamento : public d O b j e c t { public : s t a t i c d Ref<d Se t <d Ref<Departamento>>> d e p t o s ( ) ; Departamento ( const char n ) ; Departamento ( ) ; // Otros atributos pblicos u private : s t a t i c const char const name deptos ; s t a t i c d Ref<d Se t <d Ref<Departamento>>> // Otros atributos privados }; El miembro esttico deptos es una referencia a una coleccin denominada a o Deptos, que contiene la referencia a cada instancia de Departamento. Cuando la base de datos se crea, es necesario llamar una vez a una funcin o create deptos para crear la coleccin con nombre. o La funcin deptos se puede utilizar entonces para acceder a esta coleccin. o o const char const Departamento : : name deptos = Deptos ; d Ref<d Se t <d Ref<Departamento>>> deptos ; deptos ;

d Ref<d Se t <d Ref<Departamento>>> Departamento : : d e p t o s ( ) { i f ( deptos . i s n u l l () ) // Todav no accedido a d e p t o s = db . l o o k u p o b j e c t ( name deptos ) ; i f ( deptos . i s n u l l () ) { // Todav no creado a

d e p t o s = new(&db ) d Se t <d Ref<Departamento>>; db . s e t o b j e c t n a m e ( d e p t o s , name deptos ) ; } return } deptos ;

&
Diseo de Bases de Datos n ODMG-114

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Colecciones con nombre . . .

Cada constructor de Departamento inserta una referencia a su instancia en la coleccin con nombre mientras que el destructor o elimina la referencia de la coleccin. o
Departamento : : Departamento ( const char n ) : name ( n ) { d e p t o s ()> i n s e r t e l e m e n t ( t h i s ) ; // Otras inicializaciones } Departamento : : Departamento ( ) { d e p t o s ()> re m ove e l e m e nt ( t h i s ) ; // Cdigo del destructor o }

El cdigo anterior supone que todas las instancias son persistentes, o algo que no es usual ya que una aplicacin normalmente cuenta con o una mezcla de instancias persistentes y transitorias de la misma clase.

&
Diseo de Bases de Datos n ODMG-115

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

Extents Conceptualmente, un extent para la clase T es similar a un d Set<d Ref<T. Es una coleccin desordenada que contiene una referencia para cada o instancia T. Una instancia de d Extent<T> no es persistente, proporciona una interface para acceder a las instancias persistentes de T a travs de e iteradores, que pueden actuar sobre toda las instancias o sobre el subconjunto que satisface determinadas condiciones de consulta expresadas en OQL (Object Query Language). Una aplicacin que tenga que acceder a todas las instancias de la o clase Persona y sus subclases debe declarar la siguiente variable:
d D a t a ba s e dbp ; d Extent <Persona> // Database abierta P e r s o n a s ( dbp ) ;

El constructor de d Extent cuenta con un segundo argumento de tipo d Boolean que indica si se deben incluir las instancias de las subclases. El valor por defecto es d True. Si la aplicacin no quiere que se incluyan o las instancias de las subclases, la declaracin debe ser: o
d Extent <Persona> P e r s o n a s ( dbp , d F a l s e ) ;

El extent es mantenido de forma automtica por la base de datos, a por lo que las operaciones para insertar y borrar un elemento no estn accesibles para las aplicaciones. a Siempre que se crean o destruyen instancias, la base de datos actualiza el extent de forma adecuada. Ya que la aplicacin no manipula directamente el extent, la concuo rrencia es mayor que la obtenida con las colecciones con nombre.

Diseo de Bases de Datos n

ODMG-116

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Relaciones

Las relaciones describen las asociaciones entre objetos y pueden disearse directamente en una base de datos orientada a objetos. n Son varios los tipos de relaciones que se pueden denir, con la ventaja adicional de que algunos de estos tipos mantienen automticamente la integridad referencial. a Denicin y propsito de las relaciones o o La porcin ms signicativa del software de una aplicacin de base o a o de datos est generalmente dedicada al recorrido y mantenimiento a de las relaciones entre entidades. En una base de datos orientada a objetos, una relacin se o representa mediante un objeto con un conjunto de operaciones asociadas. Las asociaciones entre instancias se establecen, modican y eliminan invocando operaciones que actan sobre objetos de u tipo relacin. o Estas operaciones son las que se encargan de mantener la integridad referencial entre ambos extremos de la relacin. o

&
Diseo de Bases de Datos n ODMG-116

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Relaciones unidireccionales y bidireccionales Las relaciones pueden ser unidireccionales o bidireccionales: En una relacin unidireccional, una instancia A se relaciona con o una instancia B pero no al contrario. La relacin slo puede o o recorrerse desde A hasta el extremo B. Las relaciones bidireccionales son rec procas; cada una hace referencia a la otra. Si existe una relacin bidireccional entre las o clases A y B, entonces la clase A hace referencia a B y B hace referencia a A. Consideremos la representacin de una estructura de tipo arbol. La o clase NodoArbol<T> representa un nodo del rbol: a
template <c l a s s T> c l a s s NodoArbol : public d O b j e c t { T d Se t <d Ref<NodoArbol<T>>> }; valor ; nodoH i j o ;

Cada nodo del rbol cuenta con un conjunto de referencias a sus a hijos. Este ejemplo ilustra una relacin unidireccional. Si el recorrido o se inicia siempre en la ra del rbol la aplicacin puede utilizar z a o recursin para recorrer el rbol completo. o a Para convertir la relacin en bidireccional es necesario aadir una o n referencia al nodo padre:
template <c l a s s T> c l a s s NodoArbol : public d O b j e c t { T d Ref<NodoArbol<T>> d Se t <d Ref<NodoArbol<T>>> }; valor ; nodoPadre ; nodoH i j o ;

&
Diseo de Bases de Datos n ODMG-117

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

con lo que una aplicacin podr recorrer el rbol en ambos sentidos. o a a

&
Diseo de Bases de Datos n ODMG-118

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Relaciones recursivas Algunas relaciones tienen carcter recursivo: a En una estructura de tipo rbol, por ejemplo, cada nodo tiene a una referencia a su padre y referencias a sus hijos (ramas). La recursin permite especicar el recorrido de forma concisa. o La clase Persona proporciona un ejemplo de ello:
c l a s s Persona : public d O b j e c t { public : d Ref <Persona> d Ref <Persona> d s e t <d Ref <Persona>> }; padre ; madre ; hijos ;

Para acceder al abuelo de un individuo, podr amos utilizar la siguiente expresin: o


d Ref <Persona> d Ref <Persona> persona ; a b u e l o = pe rs ona >padre>padre ; // Inicializacin de la instancia persona o

El atributo padre es recorrido dos veces para acceder al objeto abuelo. Esta expresin muestra como se especica el recorrido a travs o e de varias instancias interrelacionadas para acceder al objeto destino. &
Diseo de Bases de Datos n ODMG-119

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Interface a las relaciones


Una relacin se representa mediante un objeto y sus operaciones o para recorrer las relaciones.
depto

Departamento
1 1 {ordenado} * empleados proyectos * * * proyectos

1 1 socio

Empleado

Proyecto

Cada departamento cuenta con un conjunto de empleados y un conjunto de proyectos. Los miembros del departamento trabajan en mltiples proyectos u y los proyectos son dirigidos (generalmente) por varios empleados. Cada empleado puede tener, como mximo, un socio (colega o a compaero), que se representa por una relacin de la clase n o Empleado consigo misma (relacin reexiva). o Estas relaciones se pueden representar tanto por mecanismos unidireccionales como bidireccionales. La clase Departamento tendr un conjunto de referencias a objetos Proyecto, pero cada a Proyecto puede no tener una relacin hacia Departamento. En o este caso la relacin es unidireccional. o Cuando se disea el esquema de datos, es necesario determinar n si el recorrido debe realizarse en las dos direcciones. &
Diseo de Bases de Datos n ODMG-120

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

Relaciones unidireccionales en ODMG El siguiente cdigo proporciona la declaracin de las relaciones o o unidireccionales para el modelo de objetos anterior. Cuando las relaciones son unidireccionales, no se requiere un objeto especial para representar la relacin; es suciente utilizar referencias o y colecciones:
c l a s s Departamento : public d O b j e c t { public : d Se t <d Ref<Empleado>> d L i s t <d Ref <Proyecto >> }; c l a s s Empleado : public d O b j e c t { public : d Ref<Empleado> d Ref<Departamento> d Se t <d Ref<Proyecto >> }; c l a s s Proye c t o : public d O b j e c t { public : d Date }; f e c h a F i n ( ) const ; socio ; depto ; proyectos ; empleados ; proyectos ;

La clase d Ref<T> representa las relaciones uno-a-uno. Las clases d List<d Ref<T y d Set<d Ref<T representan las relaciones uno-a-muchos desordenadas y ordenadas respectivamente. Estas clases, comentadas en los apartados anteriores, se utilizan para representar las relaciones unidireccionales.

Diseo de Bases de Datos n

ODMG-121

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Relaciones unidireccionales en ODMG . . . Obsrvese que la relacin entre Departamento y Empleado e o presenta recorridos a ambos extremos, pero la relacin o establecida entre ambas clases slo se realiza en la direccin o o Departamento hacia Proyecto. Cada objeto en el modelo que debe ser referenciado por otros objetos debe ser un objeto persistente independiente (no embebido en otro objeto). Por lo tanto, la coleccin empleados o de Departamento debe contener referencias a instancias d Ref<Empleado> en lugar de contener directamente objetos de la clase Empleado. Si la declaracin de empleados hubiese sido: o
d Se t <Empleado> empleados ;

los objetos Empleado ser estructuras simples embebidas en la an coleccin. No se tratar de objetos independientes con o a identidad referenciable por otros objetos de la base de datos.

&
Diseo de Bases de Datos n ODMG-121

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

Objetos relacin o El ODMG dene clases template para representar las relaciones binarias bidireccionales que son mantenidas automticamente por a el software de la base de datos. La clase d Rel Ref<T,MT> representa una relacin con una o cardinalidad uno-a-uno. La clase d Rel Set<T,MT> representa una relacin desordenada o o y la clase d Rel List<T,MT> una relacin ordenada. La aplicacin es responsable de mantener el orden basndose en la o a posicin relativa de los elementos en la lista. o Las clases se muestran en la tabla adjunta con sus correspondientes clases base. Todas las capacidades de la clase base (tales como insercin, borrado e iteracin sobre los elementos) estn disponibles o o a en la clase relacin, aunque en esto caso las operaciones mantienen o la integridad referencial. Clase relacin o d Rel Ref<T, const char *MT> Clase base d Ref<T>

d Rel Set<T, const char *MT> d Set<d Ref<T d Rel List<T, const char *MT> d List<d Ref<T Estas clase relacin se utilizan por parejas; la clase en cada extremo o de la relacin bidireccional debe contener un miembro que es una inso tancia de una de esas clases relacin. Los dos argumentos del template o representan: T: La clase en el otro extemo de la relacin. o MT: El nombre de una variable cadena de caracteres que identica al miembro en T que representa el recorrido inverso de la relacin. o

Diseo de Bases de Datos n

ODMG-122

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Objetos relacin . . . o La mejor forma de explicar cmo se utilizan estas clases es redenir o las relaciones en el ejemplo previo:
depto depto

Departamento
1 empleados miembros * 1 {ordenado} * 1 1 socio proyectos * * proyectos

Empleado

Proyecto

extern const char extern const char extern const char extern const char extern const char extern const char extern c o s n t char

socio [ ] ; depto [ ] ; emps [ ] ; p d []; d p []; proys [ ] ;

// Empleado Empleado // Empleado Departamento // Empleado Departamento // Departamento Proyecto // Departamento Proyecto // Empleado Proyecto

miembros [ ] ; // Empleado Proyecto

c l a s s Departamento : public d O b j e c t { public : d R e l S e t <Empleado , d R e l L i s t <Proyecto , }; c l a s s Empleado : public d O b j e c t { public : d R e l R e f <Empleado , d R e l S e t <Proyecto , }; c l a s s P r o y e c t o : public d O b j e c t { socio > socio ; d R e l R e f <Departamento , emps> depto ; de pt o > p d> empleados ; proyectos ;

miembros> p r o y e c t o s ;

&

public :

%
ODMG-122 DBD-13019

Diseo de Bases de Datos n

Universitat de Val`ncia e

Departament dInform`tica a

'

d R e l R e f <Departamento , d R e l S e t <Empleado , };

d p>

depto ; miembros ;

proys>

&
Diseo de Bases de Datos n ODMG-123

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Objetos relacin . . . o La clase Departamento cuenta con el miembro empleados que hace referencia a instancias de Empleado y la clase Empleado tiene una cuenta con el miembro depto que hace referencia a instancias de Departamento. En la declaracin de empleados, el segundo argumento del o template, depto, es una cadena de caracteres que contiene el valor "depto". Esta cadena hace referencia al atributo depto de Empleado, que es el miembro del recorrido inverso. De modo similar, en la declaracin del miembro depto de o Empleado el segundo argumento del template, emps, es una cadena que contiene el valor .empleados". La implementacin de la base de datos orientada a objetos o utiliza la especicacin del miembro de la relacin inversa para o o asociar los dos extremos, de modo que puede realizar las operaciones de mantenimiento de las relaciones. Si un extremo de la relacin se modica, puede actualizar automticamente el o a otro extremo. Las variables se inicializan en un chero adicional:
extern const char extern const char extern const char extern const char extern const char extern const char extern const char socio [ ] = socio ; d e p t o [ ] = depto ; emps [ ] p d [] d p [] = empleados ; = depto ; = proyectos ; // en Empleado // en Empleado // en Departamento // en Proyecto // en Departamento // en Empleado

miembros [ ] = miembros // en Proyectos proys [ ] = proyectos ;

&
Diseo de Bases de Datos n ODMG-124

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Mantenimiento de la integridad referencial

Los objetos de tipo relacin comentados anteriormente llevan a o cabo las operaciones de mantenimiento de la integridad referencial. Esto reduce signicativamente la probabilidad de introducir errores de programacin que pueden dar lugar a la prdida de la o e integridad referencial. Cuando se realiza una modicacin en un extremo de la o relacin, se deben activar determinados locks en los dos o extremos que se han de modicar. Muchas implementaciones tambin requieren que los objetos se e encuentren activos en la cache de la aplicacin cuando se o realizan las modicaciones. Para reducir la actividad de locking, en ocasiones es preferible utilizar relaciones unidireccionales y aumentar el grado de concurrencia.

&
Diseo de Bases de Datos n ODMG-125

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Gestin de relaciones uno-a-uno o Utilizaremos como ejemplo la relacin reexiva socio denida en la o clase Empleado. Supongamos que las siguientes variables de tipo Empleado existen en la base de datos:
d Ref<Empleado> d Ref<Empleado> d Ref<Empleado> jennifer ; jeremy ; brandon ;

Las operaciones que podemos realizar son: Establecer una relacin: Supongamos que debemos establecer o la relacin socios entre jennifer y jeremy, podemos usar: o
j e n n i f e r >s o c i o = j e r e m y ;

o bien:
jeremy>s o c i o = j e n n i f e r ;

Slo es necesario especicar un extremo de la relacin, el otro o o extremo es actualizado automticamente por el ODBMS. a Modicar una relacin: Supongamos ahora que jeremy y o brandon deben se socios. La aplicacin deber ejecutar la o a siguiente l nea de cdigo: o
jeremy>s o c i o = brandon ;

Esta l nea tiene como resultado las asociaciones mostradas en la gura. El atributo socio de jennifer es ahora nulo, por lo que se han efectuado de forma automtica las dos siguientes a operaciones:
j e n n i f e r >s o c i o = c l e a r ( ) ; brandon>s o c i o = j e r e m y ;

jennifer socio

"app"

jeremy socio "db" "app"

"db"

brandon socio

&
Diseo de Bases de Datos n

%
DBD-13019

ODMG-126

Universitat de Val`ncia e

Departament dInform`tica a

'

Gestin de relaciones uno-a-uno . . . o Eliminar una relacin: El siguiente cdigo pone una o o referencia nula en la relacin asociado entre jennifer y o jeremy:
j e n n i f e r >s o c i o . c l e a r ( ) ;

Eliminar un objeto: Supongamos que las relaciones son las mostradas en la gura anterior y se elimina al empleado brandon de la base de datos. Cualquier relacin bidireccional en o la que est implicado el usuario brandon debe actualizarse de e modo que no haya referencias al objeto borrado. La aplicacin o puede ejecutar cualquiera de las dos operaciones siguientes:
brandon . d e l e t e o b j e c t ( ) ;

o bien:
Empleado b = brandon . p t r ( ) ; delete b ;

para eliminar al brandon. El resultado es el mostrado en la siguiente gura, la referencia socio en jeremy se actualiza automticamente a null. a
"app"

jennifer socio

jeremy socio
"db"

"db"

brandon socio

&
Diseo de Bases de Datos n ODMG-127

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Gestin de relaciones uno-a-muchos o En este caso, uno de los extremos de la asociacin es una o coleccin de referencias en lugar de una unica referencia. o La insercin y borrado de los elementos de la coleccin se lleva a o o cabo expl citamente por la aplicacin o impl o citamente por el software de la base de datos.
jennifer : Empleado depto: d_Rel_Ref< Departamento, _emps> caroline : Empleado depto: d_Rel_Ref< Departamento, _emps>

desarrollo : Departamento empleados : d_Rel_Set< Empleado, _depto>

jeremy : Empleado depto: d_Rel_Ref< Departamento, _emps>

schaefer : Empleado depto: d_Rel_Ref< Departamento, _emps>

ventas : Departamento empleados : d_Rel_Set< Empleado, _depto>

kristen : Empleado depto: d_Rel_Ref< Departamento, _emps>

dana : Empleado depto: d_Rel_Ref< Departamento, _emps>

Supongamos los objetos e interrelaciones mostradas en la gura y supongamos adems, que denimos las siguientes variable a adicionales:
d Ref<Departamento> d Ref<Empleado> d e s a r r o l l o , ventas ; dana , s c h a e f e r , c a r o l i n e , k r i s t e n ;

&
Diseo de Bases de Datos n ODMG-128

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Gestin de relaciones uno-a-muchos . . . o Analicemos con detalle cada una de las operaciones que se pueden llevar a cabo: Establecer una relacin: Supongamos que kristen es o asignada al departamento de ventas:
k r i s t e n >depto = s a l e s ;

Tras la ejecucin, la referencia depto de kristen apunta a o ventas y adems kristen ha sido aadida impl a n citamente al conjunto de empleados en la instancia ventas. Se podr haber a obtenido el mismo resultado aadiendo directamente a kristen n al departamento ventas:
ve nt as >empleados . i n s e r t e l e m e n t ( k r i s t e n ) ;

Modicar una relacin: Supongamos que es necesario o reasignar a dana al departamento de ventas
dana>depto = v e n t a s ;

El ODBMS realiza automticamente los siguientes pasos: a


d e s a r r o l l o >empleados . re m ove e l e m e nt ( dana ) ; ve nt as >empleados . i n s e r t e l e m e n t ( dana ) ;

Eliminar una relacin: Para eliminar a caroline del o departamento de ventas se ejecutar el siguiente cdigo: a o
ve nt as >empleados . re m ove e l e m e nt ( c a r o l i n e ) ;

La referencia depto de caroline se actualiza automticamente a al valor null. Eliminar un objeto: Cuando se elimina un objeto, todas las relaciones en las que est implicado deben actualizarse para a borrar cualquier referencia.

&

Diseo de Bases de Datos n

ODMG-129

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Gestin de relaciones muchos-a-muchos o Utilizaremos la relacin entre Empleado y Proyecto para ilustrar o cmo se manipulan las relaciones muchos-a-muchos. Supondremos o que se dan las relaciones mostradas en la gura:
kristen : Empleado proyectos gui : Proyecto miembros

brandon : Empleado proyectos

database : Proyecto miembros

jennifer : Empleado proyectos

comms : Proyecto miembros

Los objetos de la clase Proyecto que utilizaremos se declaran del siguiente modo:
d Ref <Proyecto > gui , dat abas e , comms ;

&
Diseo de Bases de Datos n ODMG-130

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Gestin de relaciones muchos-a-muchos . . . o Podemos llevar a cabo las siguientes operaciones: Establecer una relacin: Aadimos al empleado jennifer al o n proyecto database:
dat abas e >miembros . i n s e r t e l e m e n t ( j e n n i f e r ) ;

Teniendo en cuenta que es el ODBMS quien mantiene la integridad referencial, el mismo resultado se podr haber a obtenido mediante:
j e n n i f e r >p r o y e c t o s . i n s e r t e l e m e n t ( d a t a b a s e ) ;

Modicar una relacin: La insercin de elementos en un o o conjunto del tipo d Rel List es un proceso algo ms sosticado, a ya que permite actualizar en posiciones concretas de la lista. Eliminar una relacin: Supongamos que eliminamos al o usuario brandon del proyecto database ejecutando la siguiente sentencia:
dat abas e >miembros . re m ove e l e m e nt ( brandon ) ;

La referencia a brandon se elimina expl citamente de la coleccin miembros del proyecto database. Impl o citamente, se elimina la referencia al proyecto database de la coleccin o proyectos de brandon. Eliminar objeto: El efecto de eliminar un objeto en una relacin muchos-a-muchos es similar al de eliminarlo en una o relacin uno-a-muchos. o Supongamos que se completa el desarrollo de la interface de usuario, y debemos eliminar el objeto referenciado por gui:
gui . d e l e t e o b j e c t ( ) ;

&

Ya que tanto kriten como brandon contienen referencias a gui, sus atributos proyectos se actualizan automticamente. a

Diseo de Bases de Datos n

ODMG-131

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Recorrido y expresiones de recorrido

El recorrido de las relaciones permite a una aplicacin navegar o entre los objetos relacionados en la base de datos. La optimizacin de las referencias y las colecciones es uno de los o puntos en los que mayor esfuerzo se ha realizado en las bases de datos orientadas a objetos. Por este motivo, las bases de datos orientadas a objetos llevan a cabo estas actividades de forma mucho ms eciente que las a bases de datos relacionales (en las que se deben establecer las asociaciones dinmicamente en tiempo de ejecucin mediante a o joins). Una expresin que navega a travs de varios objetos se denomina o e expresin de recorrido. Supongamos que dado un empleado, o deseamos imprimir informacin acerca de los proyectos en los que o est trabajando su socio: a
extern o s t r e a m &operator<<(o s t r e a m &, const P r o y e c t o &); d Ref<Empleado> d Ref<Proyecto > emp ; proy ;

d I t e r a t o r <Proyecto > p r o y s ;

p r o y s = emp>s o c i o >p r o y e c t o s . c r e a t e i t e r a t o r ( ) ; while ( p r o y s . ne x t ( proy ) ) { c o ut << proy << e n d l ; }

&

En donde hemos supuesto que se ha denido un operador de impresin para la clase Proyectos. o

%
DBD-13019

Diseo de Bases de Datos n

ODMG-132

Universitat de Val`ncia e

Departament dInform`tica a

'

Recorrido y expresiones de recorrido . . .

Alternativamente, el cdigo anterior se podr haber escrito o a utilizando la sintxis STL. Supongamos que se ha denido la a funcin: o
void p r i n t P r o y e c t o ( d Ref<Proyecto > proy ) { c out << proy << e n d l ; }

El siguiente cdigo STL llevar a cabo la misma funcin: o a o


d Ref <Empleado> o s o c i o = emp>s o c i o ; f o r e a c h ( o s o c i o >p r o y e c t o s . b e g i n ( ) , o s o c i o >p r o y e c t o s . end ( ) , printProyecto ) ;

&
Diseo de Bases de Datos n ODMG-133

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Objetos compuestos

Los modelos de objetos contienen en ocasiones objetos cuyas caracter sticas no se pueden representar mediante atributos simples embebidos en una instancia. Esos componentes se representan de forma ms adecuada mediante objetos separados. a Por supuesto, si el nmero de objetos requeridos es jo se u pueden embeber en el objeto matriz, pero este no es generalmente el caso. Estos objetos independientes se consideran componentes del objeto aun cuando no son atributos embebidos. El objeto que los soporta se denomina objeto compuesto y se dice que est formado por subobjetos. En ocasiones tambin a e se emplea eel nombre de objetos compuestos para describirlos. Otro de los motivos por el que los subobjetos se representan mejor mediante objetos separados est en la posibilidad de a establecer relaciones entre ellos. El objeto compuesto es el contexto en el que existen los subobjetos y sus relaciones. El valor del objeto compuesto se basa en sus atributos junto con los valores de sus subobjetos y sus atributos y relaciones.

&
Diseo de Bases de Datos n ODMG-134

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplos de objetos compuestos En el ejemplo de departamentos, empleados y proyectos utilizado hasta ahora, cualquiera de esos objetos puede ser un objeto compuesto. La clase Departamento contiene un conjunto de proyectos y a su vez un conjunto de procesos de desarrollo que deben completarse para cada proyecto. La clase Departamento tambin cuenta con un conjunto de e objetos Empleado. Es ms lgico suponer que los empleados son a o miembros de la compa como un todo. Si el departamento se na disuelve, los empleados son reasignados. Las instancias Proyecto asociadas a un departamento pueden considerarse subobjetos de su instancia Departamento. La clase Proyecto puede ser a su vez un objeto compuesto, cuyos subobjetos representan las etapas requeridas para completar el proyecto. Cada etapa puede tener un dueo y n una fecha de conclusin. o En la gura se muestran las relaciones entre las clases descritas:
depto

Departamento
1 1 empleados * miembros * 1 responsable 1 proyectos * * proyectos depto

procesos *

Empleado

Proyecto

Proceso
proceso 1

* *

etapa *

EtapaProyecto

&
Diseo de Bases de Datos n ODMG-135

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplos de objetos compuestos . . . Si ambos, Departamento y Proyecto son objetos compuestos, las relaciones entre estas clases pueden representarse mediante las siguientes declaraciones de clase:
extern const char extern const char extern const char extern const char extern const char extern c o s n t char depto [ ] ; emps [ ] ; p d []; d p []; m ie m bros [ ] ; proys [ ] ; // Empleado Departamento // Empleado Departamento // Departamento Proyecto // Departamento Proyecto // Empleado Proyecto // Empleado Proyecto

c l a s s Departamento : public d O b j e c t { d R e l L i s t <P r o y e c t o , p d > d R e l S e t <Empleados , d e p t o > d L i s t <d Re f<P r o c e s o > > // Otros miembros }; c l a s s Empleado : public d O b j e c t { d R e l R e f <Departamento , d R e l S e t <P r o y e c t o , }; extern const char extern const char extern const char extern const char extern const char extern const char depto [ ] emps [ ] p d [] d p [] proys [ ] = depto ; // en Empleado emps> depto ; proyectos ; miembros> proyectos ; e m p l e a d os ; procesos ;

= e m p l e a d o s ; // en Departamento = depto ; // en Proyecto = p r o y e c t o s ; // en Departamento // en Proyectos = p r o y e c t o s ; // en Empleado

m ie m bros [ ] = miembros

&
Diseo de Bases de Datos n ODMG-136

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Ejemplos de objetos compuestos . . . Cada departamento cuenta con un conjunto de las etapas que se deben realizar para cada proyecto. Este conjunto puede ser diferente para cada departamento, de modo que cada uno de ellos cuenta con su propia lista. La clase Proceso contiene informacin general asociada a un o proceso que no es espec ca de un proyecto particular.

c l a s s P r o c e s o : public d O b j e c t { d String d String // etc... }; nombre ; descripcion ;

La aplicacin no necesita recorrer desde una instancia Proceso a o cada una de las instancias EtapaProyecto asociada con ella, por lo que no se ha previsto la expresin de recorrido (traversal path). o

&
Diseo de Bases de Datos n ODMG-137

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

' Ejemplos de objetos compuestos . . . La clase EtapaProyecto est constituida por miembros a denominados proceso que hacen referencia a una instancia Proceso. Cada proyecto debe mantener la informacin acerca de o sus etapas. Cada instancia Proyecto cuenta con instancias EtapaProyecto para cada instancia Proceso referenciada en el atributo procesos de la clase Departamento.
c l a s s Proye c t o : public d O b j e c t { d R e l R e f <Departamento , d R e l S e t <Empleado , // Otros atributos }; c l a s s EtapaProyecto : public d O b j e c t { d Ref<Proceso > d Date d Date d Ref<Empleado> // Otros miembros }; proceso ; fechaPrevista ; fechaConclusion ; responsable ; d p> depto ; miembros ; e t apa ; proys >

d L i s t <d Ref <EtapaProyecto>>

La clase Proyecto se considera un objeto compuesto ya que gestiona un conjunto de instancias EtapaProyecto. La aplicacin accede a las instancias de EtapaProyecto slo a o o travs del miembro etapa de Proyecto. e &
Diseo de Bases de Datos n ODMG-138

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Subobjetos Como se ha dicho, un subobjeto acta como componente de un u objeto compuesto. Un objeto embebido como miembro de otra clase no se considera un subobjeto. Un subobjeto puede ser un objeto simple u otro objeto compuesto, por lo que es posible construir objetos compuestos organizados en una jerarqu de complejidad arbitraria. a Un objeto se considera un subobjeto si su existencia depende su objeto compuesto base; es decir, no puede existir sin su objeto compuesto. Cuando una aplicacin elimina un objeto compuesto, se o eliminan tanto el objeto base como todos sus subobjetos. El destructor del objeto compuesto es responsable de propagar la operacin de borrado a todos los subobjetos. o Referencias a objetos que no son subobjetos Un objeto que contiene referencias (d Ref<T>) o una coleccin o de referencias a otros objetos de tipo T no es necesariamente un objeto compuesto. De modo similar, un objeto compuesto puede contener adems a referencias a objetos que no son sus subobjetos. Estos objetos referenciados no se consideran componentes del objeto compuesto y no estn afectados por las operaciones de borrado a del objeto compuesto.

&
Diseo de Bases de Datos n ODMG-139

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Referencias a objetos que no son subobjetos . . . La aplicacin que hemos estado usando presenta varios ejemplos de o esto: La clase EtapaProyecto contiene un miembro proceso que es una referencia a Proceso y un miembro responsable que referencia a una instancia de Empleado. Ninguno de estos miembros se pueden considerar subobjetos de la instancia EtapaProyecto. De modo similar, la clase Departamento contiene una coleccin o de referencias a Empleado denominada empleados. En este modelo, las instancias de Empleado no son subobjetos de Departamento, an cuando Departamento es un objeto u compuesto que cuenta con subobjetos para la gestin de los o proyectos y los procesos. Objeto compuesto base Las operaciones que son espec cas del objeto compuesto se denen normalmente dentro de la clase del objeto compuesto base. Su implementacin requiere generalmente la manipulacin o o de subobjetos. El objeto compuesto base debe aparecer como una entidad atmica. o Uno de los objetivos en la denicin de un objeto compuesto es o obtener un alto grado de atomicidad an cuando el objeto u est compuesto por una agregacin de otros objetos. a o

&
Diseo de Bases de Datos n ODMG-140

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones

Las operaciones que se aplican sobre un objeto compuesto generalmente implican operar sobre sus subobjetos. Este fenmeno se denomina propagacin de operaciones. o o Ms an, algunas operaciones sobre objetos compuestos deben a u necesariamente propagarse a todos sus subobjetos (por ejemplo, el borrado). La semntica de las operaciones comunes deben denirse en la a clase base. El diseador de la clase debe decidir si estas operaciones deben n ser superciales o en profundidad. Las operaciones cannicas de o C++ (copia, borrado y asignacin) suelen ser operaciones en o profundidad. Un subobjeto es independiente del objeto compuesto base que lo contiene. Por tanto, cuando una operacin de copia se aplica al o objeto compuesto base, la operacin debe crear una copia de o cada subobjeto. Supongamos dos instancias A y B de un objeto compuesto base. Una asignacin de B a A debe borrar todos los objetos actuales o de A y realizar una copia de todos los subobjetos de B. Normalmente se requieren operaciones en profundidad para llevar a cabo esta tarea. Por denicin, el borrado de un objeto compuesto debe o propagarse a todos sus subobjetos, aunque es importante recordar que un objeto compuesto puede contener referencias a objetos que no deben ser borrados. Es responsabilidad de la aplicacin gestionar adecuadamente esta situacin. o o

&

Diseo de Bases de Datos n

ODMG-141

DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones . . .

En la aplicacin que nos sirve de ejemplo, las clases Departamento o y Proyecto son objetos compuestos. Sus destructores proporcionan las operaciones adecuadas para manejar sus subobjetos:
Proye c t o : : Proye c t o ( ) { d I t e r a t o r <d Ref<EtapaProyecto>> d Ref<EtapaProyecto> ep ; i t e r = EtapaProyecto . c r e a t e i t e r a t o r ( ) ; while ( i t e r . ne xt ( ep ) ) ep . d e l e t e o b j e c t ( ) ; } Departamento : : Departament ( ) { d I t e r a t o r <d Ref<Proceso >> d I t e r a t o r <d Ref<Proyecto >> d Ref<Proceso > d Ref<Proyecto > iter proceso ; iter proyecto ; proc ; proy ; iter ;

i t e r pr o c e s o = procesos . c r e a t e i t e r a t o r ( ) ; while ( i t e r p r o c e s o . ne xt ( proc ) ) proc . d e l e t e o b j e c t ( ) ; iter proyecto = proyectos . c r e a t e i t e r a t o r ( ) ; while ( i t e r p r o y e c t o . ne xt ( proy ) ) proy . d e l e t e o b j e c t ( ) ;

&

%
DBD-13019

Diseo de Bases de Datos n

ODMG-142

Universitat de Val`ncia e

Departament dInform`tica a

'

&
Diseo de Bases de Datos n ODMG-143

%
DBD-13019

Universitat de Val`ncia e

Departament dInform`tica a

'

Operaciones . . .

Consideraciones de locking Algunas bases de datos permiten la propagacin de bloqueos, o aunque no est soportado en el estndar ODMG. a a El diseador debe determinar cundo el bloqueo de un objeto n a compuesto implica tambin el bloqueo de sus subobjetos. e La base de datos determina automticamente que cuando un a determinado objeto adquiere un bloqueo, debe propagar esta accin a todos los objetos relacionados. o Un objeto bloqueado indirectamente puede a su vez propagar el bloqueo a otros objetos, alcanzando a un gran nmero de u objetos y limitando la concurrencia. Otra posibilidad consiste en establecer una pol tica de bloqueo cuando se accede a un objeto compuesto. Por ejemplo, podr imponerse el requisito de que una aplicacin a o debe bloquear el objeto compuesto antes de acceder a todos sus subobjetos (bloqueando impl citamente todos los subobjetos).

&
Diseo de Bases de Datos n ODMG-144

%
DBD-13019

Das könnte Ihnen auch gefallen