db40 es un motor de base de datos orientada a objetos (o base de objetos) liberado bajo licencia GPL
Imprimir

Bloque de Conocimiento de db40

Tabla de contenidos

Introducción

OODB son las siglas de "Base de Datos Orientada a Objetos" y RDB es "Base de Datos Relacional". Existe una gran variedad de RDB, no así tantos de OODB. db4o (DB for Objects) es una implementación de OODB libre (bajo GPL - General Public Licence, por lo tanto de código abierto) que se encuentran actualmente en el mercado. db4o representa una alternativa a las bases de datos relacionales utilizadas tradicionalmente.

Nota: varios autores llaman ODBMS y RDBS a lo que en esta página se menciona como OODB y RDB.

Contenidos

Diferencias principales entre OODB y RDB

La diferencia entre un tipo de base de datos y el otro radica en la naturaleza con la que se guardan, consultan y manejan los datos. En las bases de datos relacionales los datos están en registros de tablas, que almacenan datos propiamente dichos o referencias a registros de otras tablas. En el modelo relacional el mapeo entre los objetos del modelo de negocio y las tablas debe establecerse y configurarse en tiempo de desarrollo. En cambio usando db4o y las demás bases de datos orientadas a objetos esto es transparente al desarrollador, quien sólo llama desde su código a métodos del objeto que administra la base de datos para realizar una consulta, dar un alta, una modificación o eliminar algún objeto de la base de objetos. El tiempo de desarrollo es mucho menor en una solución orientada a objetos si se utiliza una OODB.

Ventajas principales de OODB frente a RDB

  • Mayor velocidad de desarrollo (tranparencia)
    • No hay mapeos entre objetos y tablas
    • No hay que crear componentes que accedan a las bases de datos
    • El código de acceso a la base es muy sencillo y entendible (métodos get, set y delete) en el caso de db4o.
  • Mejor performance con objetos de negocio complejos (árboles, estructuras anidadas, relaciones N a N, relaciones recursivas)
  • Fácil Backup (la base completa está en un solo archivo)
  • No necesita administración
    • Tiene un recolector de basura - garbage collector - que borra los objetos que no son referenciados
    • Al cambiar algo en las clases no se necesita modificar nada en la base de objetos
  • Las búsquedas se hacen directamente usando objetos.
    • Búsquedas usando objetos, sencillas (QBE, "Query By Example")
    • Búsquedas Nativas (la manera recomendada para buscar)
    • Búsquedas usando la "SODA Query API" (búsquedas de bajo nivel)
  • Los cambios en los objetos (agregar o quitar atributos a una clase) se aplican directamente en la base, sin tener que migrar datos ni reconfigurar nada.

Descarga y utilización de db4o (para Java)

  • Primero hay que bajar el archivo que contiene el jar con las clases de db4o. Se puede encontrar tanto en la sección de Community (external link) o como en la sección TestDrive (external link) de la página oficial del producto.
  • Para usar el jar, simplemente hay que extraerlo del zip en el que viene comprimido (dentro del directorio lib) y colocarlo donde más nos guste. Luego simplemente se importa desde el código y se empieza a usar :)

Herramientas para el manejo de bases de datos de db4o

Se pueden bajar dos herramientas para el manejo de bases de objetos, desde la sección de descargas (external link) del sito oficial de db4o.

  • ObjectManager (para navegar el contenido de la base de objetos y hacer consultas)
  • Plugin para Eclipse (idem ObjectManager , pero dentro del Eclipse)

Ejemplo de uso

A continuación se expone un sencillo ejemplo práctico de utilización de db4o hecho en Java.

ObjectOrientedDataBase se trata de una clase que encapsula los métodos de Db4o get, set y delete, brindando las opciones de insertar un objeto en la base de objetos, actualizarlo y borrarlo de la base de datos, así como también hacer tres tipos de búsqueda: usando un objeto con datos filtros, usando la clase (NombreClase.class) (para obtener todos los objetos de dicha clase que existan) o con una consulta (String).

Esta implementación trabaja con objetos de la clase Object, por lo que se puede utilizar con cualquier clase que se quiera persistir. A su vez, hereda de una clase abstracta simplificada (AbstractDataBase).

El ejemplo realizado con la clase ObjectOrientedDataBase es una aplicación que da de alta y modifica varios pilotos de carreras, tal como lo hace el tutorial oficial de db4o. Dista de ser algo demasiado elaborado y tiene cosas por corregir, pero apunta a mostrar la simplicidad con la que se puede trabajar con db4o.

Tips para empezar

  • Para hacer una actualización, primero hay que hacer un get y recién luego, con el (o los) objeto(s) encontrado(s), llamar a set, previa modificación. Se puede observar una implementación de actualización en el método "actualizar()" de la clase ObjectOrientedDataBase.
  • De la misma forma, para borrar un objeto de la base, primero hay que hacer un get y recién luego, con el (o los) objeto(s) encontrado(s), llamar a delete. Se puede observar una implementación de borrado en el método "borrar()" de la clase ObjectOrientedDataBase.
  • Para que se tomen todos los cambios de objetos complejos en una actualización, hay que setearlo llamando a cascadeOnUpdate(true), dado que por defecto sólo se actualizan los atributos del objeto que son de tipos base y los atributos String. Ejemplo:

Db4o.configure().objectClass("com.epidataconsulting.epidata.colmena.db.db4o.ejemplo.Piloto").cascadeOnUpdate(true);

Activation en db40 (Lazy Inicialization)

db4o implementa el concepto de Lazy Inicialization (inicialización tardía) de una manera muy elegante: se maneja con la activation (activación) de atributos, con niveles. Por defecto se levantan de la base sólo los atributos de los objetos anidados hasta 5 niveles a partir del objeto solicitado (con get). A partir del sexto nivel, los valores son llenados con null (en las referencias a objetos) o con valores nulos (en los atributos de tipos básicos).

Esto se hace así para evitar colocar en memoria una estructura demasiado grande que pueda generar una OutOfMemoryException .

Si se quisiera usar un objeto que se encuentre en un nivel posterior al quinto (o al establecido) habrá que activarlo, mediante el método activate() del ObjectContainer .

  • Ejemplo de activation por cada atributo visitado (recorriendo una lista)
    • Supongamos una lista simplemente enlazada de objetos de la clase Nodo. Si se quiere recorrer toda la lista sin obtener un null en el medio, entonces activaremos cada enlace antes de continuar con el recorrido:

ObjectSet resultado = objectContainer.get(Nodo.class);
Nodo objeto = (Nodo) resultado.next(); // para obtener el 1er ítem que se obtuvo de la base de objetos
Nodo siguiente = objeto.getSiguiente();
while (siguiente != null) {
    objectContainer.activate(siguiente, PROFUNDIDAD_DE_ACTIVACION); // esta constante suele ser 1
    procesarNodo(siguiente);
    siguiente = siguiente.getNext();
}

También se puede configurar Db4o para que el nivel de activación sea menor o mayor a 5, si la performance no es la esperada en la persistencia de determinado modelo de negocio. Puede setearse para una clase o bien para todas las clases.

  • Ejemplos de configuración de la activation a nivel general o por clase
    • Para una clase en particular:

Db4o.configure().objectClass(NombreClase.class).cascadeOnActivate(true);

    • Para toda las clases persistidas:

Db4o.configure().activationDepth(activationDepth)

Otras Fuentes de Información

Documentación oficial

  • Se puede visitar este completo tutorial online (external link) que muestra paso a paso la funcionalidad del producto, de forma clara y con ejemplos prácticos de código fuente. El tutorial también se encuentra en el archivo descargado.

Proyectos en los que se usó

Documentación existente

Documentación existente en Epidata debidamente comentada. La documentación puede ser, file Explorer, biblioteca interna etc.

Bibliografía

Referentes

  • Torto

Otras páginas de interés

Paginas de interés dentro de la wiki. Debidamente comentadas.


Contribuyentes a esta página: PabloLFC9744 puntos  , Depa4644 puntos  , AndresG , matias_suarez y diegom .
Page last modified on Jueves 20 de Noviembre, 2008 05:38:03 EST by PabloLFC9744 puntos .
El contenido de esta página esta licenciado bajo los términos del http://creativecommons.org/licenses/by-sa/2.5/legalcode.

Usuarios en línea

15 usuarios en línea