En el mundo de bases de datos existe un debate muy fuerte entre si es mejor usar los modelos relacionales (SQL) o no relacionales (No-SQL). Y ambos tienen argumentos a favor muy buenos.
En este artículo analizaremos las ventajas de cada uno y aprenderemos cómo combinar lo mejor de los dos mundos. ** El modelo relacional es más eficiente con el uso de memoria y nos ofrece la opción de hacer búsquedas más complejas; pero es menos eficiente en escala y su estructura de datos es poco flexible. Por otro lado, el modelo no relacional es más reciente y resulta muy fácil de escalar. En este último, los datos orientados a objetos son flexibles** (algunos opinan que demasiado) y suelen ser excelentes para aplicaciones web. Esto porque **usan JSON como su formato de datos. **Sin embargo, suelen ocupar más tamaño en memoria y puede resultar poco eficiente o complicado indexar los datos para su búsqueda. En realidad ambas opciones son buenas. Y cada una supera a la otra en escenarios diferentes. Pero para los que no logran decidirse, es posible usar ambos en un mismo proyecto. Existen modelos _exóticos, _mejor conocidos como post-relacionales o híbridos. PostgreSQL es un ejemplo. Parte de SQL, pero le agrega características modernas y elimina muchas de las limitaciones tradicionales. Nos permite trabajar con datos en formato JSON o JSONB. Es decir, con datos en texto plano o en binario. La ventaja de este último radica en que el cliente no tiene que descargar el objeto completo para analizarlo; ya que permite que su contenido pueda ser indexado para hacer búsquedas en el servidor. Gracias a JSONB, ya no es necesario elegir entre una base de datos SQL y No-SQL. Esto quiere decir que podemos integrar las tablas de datos con el contenido de los documentos. Esto permite, por ejemplo, encontrar un documento de la forma tradicional; pero sólo obtener la parte de coincida con los datos que buscamos. De esta manera, necesitaremos menos ancho de banda y procesamiento por parte de nuestros clientes. Una situación extremadamente útil para aplicaciones móviles. En artículos anteriores aprendimos como crear un API JSON y a usar datos en tiempo real con PostgreSQL, NodeJS y ReactJS. Hoy vamos a explorar más sobre cómo aprovechar el potencial de JSONB.
Imaginemos que deseamos crear una base de datos usando el Query Tool de pgAdmin con el contenido de unas repisas. Empecemos creando una tabla a la que llamaremos shelves.
CREATETABLE shelves ( shelve_id PRIMARY KEY, data JSONB);
Podemos indexar nuestros datos usando un método llamado “Índice Generalizado Invertido” conocido como índice GIN. Este permite indexar los datos compuestos de nuestros objetos JSONB.
CREATEINDEXON shelves USING GIN (data);
Insertar datos en la tabla es muy fácil. Y gracias a que estamos usando JSON, la estructura de nuestros datos es muy flexible.
INSERT INTO shelves (shelve_id, data) VALUES (1, '{"contents":[{"name":"Object 8","price":"5"}, {"name":"Object 9","price":"5"}], "maxWeight":"2"}') , (2, '{"contents":[{"name":"Object 6","price":"4"}, {"name":"Object 7","price":"4"}], "maxWeight":"2"}') , (3, '{"contents":[{"name":"Object 4","price":"5"}, {"name":"Object 4","price":"5"}], "maxWeight":"2"}') , (4, '{"contents":[{"name":"Object 2","price":"4"}, {"name":"Object 2","price":"4"}, {"name":"Object 3","price":"6"}], "maxWeight":"3"}') , (5, '{"contents":[{"name":"Object 1","price":"5"}, {"name":"Object 1","price":"5"}, {"name":"Object 1","price":"5"}], "maxWeight":"3"}') ;
Ahora, si deseamos obtener todos los datos de la repisa 5, podemos usar un query como:
SELECTdataFROM shelves WHERE shelve_id = 5
Y tendremos como resultado:
"{"contents": [{"name": "Object 1", "price": "5"}, {"name": "Object 1", "price": "5"}, {"name": "Object 1", "price": "5"}], "maxWeight": "3"}"
Encontrar el objeto que necesitamos rápidamente usando el ID es útil. Pero para usar el poder de JSONB imaginemos que deseamos obtener sólo las repisas que tengan un valor de maxWeight de 3. Para lograrlo podemos usar un query como:
SELECTdataFROM shelves WHEREdata @> '{"maxWeight":"3"}'
Obtendremos como resultado los objetos 4 y 5.
"{"contents": [{"name": "Object 2", "price": "4"}, {"name": "Object 2", "price": "4"}, {"name": "Object 3", "price": "6"}], "maxWeight": "3"}""{"contents": [{"name": "Object 1", "price": "5"}, {"name": "Object 1", "price": "5"}, {"name": "Object 1", "price": "5"}], "maxWeight": "3"}"
Ahora que sabes los comandos básicos para explotar el potencial de JSONB en PostgreSQL, te invito a que tomes el **Curso de PostgreSQL **en Platzi. Ahí aprenderás todos los secretos para crear aplicaciones épicas que se actualizan en tiempo real.