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.