LHe estado trasteando en mis madrugadas con MongoDB y CouchDB, y la verdad, tengo sentimientos muy encontrados.

El fin del corsé relacional

Durante años, hemos sido esclavos del esquema. Si recuerdas cuando hablábamos de romper la Tercera Forma Normal para ganar rendimiento, sabrás que el modelo relacional tradicional a veces es un dolor de cabeza cuando quieres escalar o cuando los requisitos cambian cada martes.

La promesa de NoSQL es simple: tira el esquema por la ventana y guarda los datos en formato de documentos (generalmente JSON o BSON). No hay tablas, no hay columnas rígidas, y lo más aterrador para los puristas... no hay JOINs.

Para probarlo, me bajé los binarios de MongoDB 1.2, lo arranqué en mi máquina local y me puse a picar un pequeño script en Python usando la librería pymongo.

Un ejemplo práctico: Guardando datos sin pensar

Imagina que estamos guardando perfiles de usuario. En MySQL tendríamos una tabla usuarios, otra telefonos y otra direcciones, y haríamos un galimatías de claves foráneas. En Mongo, simplemente le lanzas un diccionario de Python y él se encarga del resto.

import pymongo
from pymongo import Connection

# Conectamos al servidor local en el puerto por defecto
conexion = Connection("localhost", 27017)
db = conexion.mi_proyecto
coleccion = db.usuarios

# Creamos un documento JSON al vuelo.
# Fíjate que un usuario tiene Twitter y el otro no. No pasa nada.
usuario_1 = {
    "nombre": "Carlos",
    "edad": 28,
    "habilidades": ["Python", "C", "MySQL"],
    "contacto": {
        "email": "carlos@ejemplo.com",
        "twitter": "@carlos_dev"
    }
}

usuario_2 = {
    "nombre": "Ana",
    "edad": 25,
    "habilidades": ["PHP", "JavaScript"],
    "contacto": {
        "email": "ana@ejemplo.com"
    } # No tiene twitter, a Mongo le da igual.
}

coleccion.insert(usuario_1)
coleccion.insert(usuario_2)

# Buscar todos los que saben Python
for u in coleccion.find({"habilidades": "Python"}):
    print "Encontrado:", u["nombre"]

Es ridículamente fácil. No tuve que definir la estructura antes. Si mañana decido que a los nuevos usuarios les voy a guardar también el "color favorito", simplemente lo añado en el código y ya está. Mongo no se queja. Y como guarda los datos en formato binario continuo (BSON), la lectura es rapidísima.

También he mirado de reojo a CouchDB, que utiliza una API REST nativa sobre HTTP, lo que me parece una locura maravillosa para interactuar directamente con JavaScript desde el cliente, pero su sistema de vistas basado en MapReduce en JavaScript se me hace un poco esotérico por ahora comparado con las consultas clásicas.

¿Es este el futuro o una moda para hipsters?

Veo luces y sombras. Por un lado, la velocidad de desarrollo es brutal. Para un prototipo o una aplicación web donde los datos no tienen mucha estructura (como un muro de red social o un sistema de logs), me parece una herramienta espectacular.

Por otro lado, la falta de transacciones ACID complejas me aterra. Si estoy programando el software de facturación de un banco o un carrito de la compra con alta concurrencia, quiero mis transacciones, mis bloqueos por fila y mis relaciones aseguradas a nivel de motor, no a nivel de código de aplicación.

Creo que MySQL y PostgreSQL tienen cuerda para rato. Las bases de datos NoSQL no van a matar al modelo relacional, sino que van a convivir. Usaremos MySQL para el dinero y MongoDB para los datos masivos no estructurados. Veremos si el tiempo me da la razón o si en cinco años todos estamos escribiendo consultas en JSON y nos hemos olvidado del SELECT.