8.ab.1 Características y Aplicaciones de las Bases de Datos Orientadas a Objetos

Objetivo

Identificar las características de las bases de datos orientadas a objetos y analizar su aplicación en el desarrollo de aplicaciones mediante lenguajes orientados a objetos.

Contenidos

1. ¿Qué es una base de datos orientada a objetos?

Una base de datos orientada a objetos es un sistema de almacenamiento que guarda los datos de forma parecida a como los usamos en un programa orientado a objetos.

En Java o JavaScript solemos trabajar con objetos:

Alumno alumno = new Alumno("Ana", "1º DAW");
const alumno = {
	nombre: 'Ana',
	grupo: '1º DAW'
};

En una base de datos relacional tradicional, como SQLite, MySQL o PostgreSQL, esos datos se guardan normalmente en tablas:

CREATE TABLE Alumno (
	id INTEGER PRIMARY KEY,
	nombre TEXT,
	grupo TEXT
);

En una base de datos orientada a objetos se intenta guardar directamente el objeto, con sus atributos y sus relaciones con otros objetos.

2. Características principales

Las bases de datos orientadas a objetos se entienden mejor si las relacionamos con los conceptos que ya conocemos de programación orientada a objetos.

a) Almacenan objetos completos

No se guardan solamente filas y columnas. Se pueden almacenar estructuras más complejas: objetos con otros objetos dentro, listas, mapas o fechas.

class Alumno {
	String nombre;
	List<Calificacion> calificaciones;
}

b) Mantienen identidad de objeto

Dos objetos pueden tener los mismos datos, pero seguir siendo objetos distintos. Una base de datos orientada a objetos puede conservar esa identidad propia.

Alumno a1 = new Alumno("Ana");
Alumno a2 = new Alumno("Ana");

c) Permiten relaciones entre objetos

Un objeto puede contener referencias a otros objetos. En una base relacional se suelen usar claves ajenas. En una base orientada a objetos se intenta guardar esa relación de una forma más natural.

class Pedido {
	Cliente cliente;
	List<LineaPedido> lineas;
}

d) Encajan con herencia y composición

La herencia, la composición y la agregación son habituales en POO. En una base relacional hay que traducir esos conceptos a tablas; en una base orientada a objetos forman parte natural del modelo.

e) Buscan una persistencia más transparente

La persistencia consiste en hacer que los datos sigan existiendo después de cerrar el programa. En vez de pensar constantemente en tablas e instrucciones SQL, se intenta trabajar con operaciones más cercanas al lenguaje:

guardar(alumno);

3. Comparación con una base de datos relacional

Aspecto Base relacional Base orientada a objetos
Unidad principal Tabla y fila Clase y objeto
Lenguaje habitual SQL API del lenguaje o consultas sobre objetos
Relaciones Claves primarias y ajenas Referencias entre objetos
Herencia Hay que simularla con tablas Se representa de forma más natural
Ventaja principal Estándar, muy usada y potente para consultas Encaja mejor con modelos POO complejos
Inconveniente principal Hay que transformar objetos en tablas Menos estándar y menos habitual que SQL

4. ¿Cuándo pueden ser útiles?

Las bases de datos orientadas a objetos pueden ser útiles cuando la aplicación tiene un modelo de clases complejo y muchas relaciones entre objetos.

Algunos ejemplos son:

  • una aplicación de escritorio que guarda objetos Java;
  • una app móvil que funciona sin conexión;
  • un videojuego que guarda partidas con muchos objetos relacionados;
  • una aplicación web offline que guarda datos en el navegador.

No siempre son la mejor opción. Si necesitamos informes complejos, muchas consultas estadísticas, integración con otras herramientas o trabajo compartido con muchos sistemas, una base de datos relacional suele ser más práctica.

5. Sistemas y tecnologías en Java

En Java existen tecnologías pensadas para guardar objetos de forma persistente. Algunas son bases orientadas a objetos propiamente dichas y otras son estándares o herramientas de persistencia.

ObjectDB

ObjectDB es una base de datos de objetos para Java. Puede trabajar con los estándares JPA y JDO, y permite usar objetos Java persistentes sin depender de una base relacional externa.

@Entity
public class Alumno {
	@Id
	@GeneratedValue
	private Long id;

	private String nombre;
	private String grupo;
}
entityManager.getTransaction().begin();

Alumno alumno = new Alumno();
alumno.setNombre("Ana");
alumno.setGrupo("1º DAW");

entityManager.persist(alumno);

entityManager.getTransaction().commit();

ObjectBox

ObjectBox es una base de datos embebida orientada a objetos, usada especialmente en aplicaciones Android, Java, Kotlin, móviles e IoT. Puede ser una alternativa a SQLite cuando queremos guardar objetos localmente.

JDO y JPA

JDO significa Java Data Objects. Es un estándar para acceder a datos persistentes usando objetos Java normales.

JPA se usa habitualmente para mapear objetos Java sobre bases de datos relacionales. Por eso, JPA con Hibernate y MySQL no es una base orientada a objetos pura, sino un caso de mapeo objeto-relacional.

6. Sistemas y tecnologías en JavaScript

En JavaScript debemos distinguir entre el código que se ejecuta en el navegador y el código que se ejecuta fuera del navegador, por ejemplo con Node.js.

IndexedDB

IndexedDB es la tecnología más importante en navegador. Está incluida en los navegadores modernos y permite almacenar objetos JavaScript de forma persistente. No usa SQL, sino almacenes de objetos, claves, índices y transacciones.

const peticion = indexedDB.open('CentroEducativo', 1);

peticion.onupgradeneeded = function(evento) {
	const db = evento.target.result;

	db.createObjectStore('alumnos', {
		keyPath: 'id',
		autoIncrement: true
	});
};

peticion.onsuccess = function(evento) {
	const db = evento.target.result;
	const transaccion = db.transaction('alumnos', 'readwrite');
	const almacen = transaccion.objectStore('alumnos');

	almacen.add({
		nombre: 'Ana',
		grupo: '1º DAW'
	});
};

Dexie.js

Dexie.js no es una base de datos distinta. Es una librería que facilita el uso de IndexedDB mediante una API más cómoda, basada en promesas y compatible con async y await.

const db = new Dexie('CentroEducativo');

db.version(1).stores({
	alumnos: '++id, nombre, grupo'
});

await db.alumnos.add({
	nombre: 'Ana',
	grupo: '1º DAW'
});

localForage

localForage simplifica el almacenamiento local en navegador. Ofrece una API parecida a localStorage, pero asíncrona, y usa IndexedDB cuando está disponible.

await localforage.setItem('alumno1', {
	nombre: 'Ana',
	grupo: '1º DAW'
});

const alumno = await localforage.getItem('alumno1');

Realm JS

Realm JS fue una tecnología muy usada para almacenar objetos en aplicaciones móviles y React Native. Actualmente conviene tratarla con cautela para proyectos nuevos, porque MongoDB anunció la retirada de Atlas Device Sync y los SDK asociados.

7. Tecnologías disponibles en el navegador

Para una aplicación web que se ejecuta directamente en el navegador, la opción fundamental es IndexedDB. Dexie.js y localForage no sustituyen a IndexedDB: normalmente son capas que facilitan su uso.

Tecnología ¿Disponible en navegador? Comentario
IndexedDB Sí Base de datos nativa del navegador para objetos JavaScript.
Dexie.js Sí Librería que simplifica el uso de IndexedDB.
localForage Sí API sencilla sobre IndexedDB, WebSQL o localStorage.
ObjectDB No Pensada para aplicaciones Java.
ObjectBox Java No directamente Más orientada a Java, Kotlin, Android, JVM e IoT.
Realm JS No como opción estándar de navegador Más relacionada con móvil y React Native; requiere cautela por cambios recientes.

Conclusión: si estamos creando una aplicación web offline que debe funcionar en el navegador, debemos estudiar especialmente IndexedDB. Para alumnos que empiezan, Dexie.js puede ser una forma más sencilla de practicar con esa tecnología.

8. Ideas para recordar

  • Una base de datos orientada a objetos intenta guardar los datos como objetos, no como filas de una tabla.
  • Sus conceptos principales son objeto, identidad, referencia, clase, herencia y persistencia.
  • En Java destacan tecnologías como ObjectDB, ObjectBox y estándares como JDO.
  • JPA se usa mucho en Java, pero normalmente para mapear objetos sobre bases de datos relacionales.
  • En navegador, la opción más importante es IndexedDB.
  • Dexie.js y localForage facilitan el trabajo con almacenamiento local en JavaScript.
  • La mejor tecnología no depende solo del lenguaje, sino del tipo de aplicación, las consultas necesarias y el entorno de ejecución.

Bibliografía