SQL para bases de datos NoSQL
Por diferentes razones las bases de datos no relacionales se han hecho muy populares, quizás muchas de ellas es por su versatilidad a la hora de estructurar la información que se guardara en ellas, actualmente con el crecimiento del uso del cloud computing y la masificacion de uso y pago por servicios, algunas bases de datos como DynamoDB, DocumentDB, Google Datastore etc han ganado gran popularidad, aunque aquí no se tengan las clásicas tablas Ver Figura 1 y gran parte de la información de estas database as a service se consulte por medio de apis, sdk o cli, se sigue teniendo la necesidad de administrar y gestionar, por esta razón muchas veces esta administración requiere de filtrados o consultas demasiados complejas (debido a las estructuras json anidadas) y es en este momento es cuando mas se puede llegar a extrañar SQL
PartiQL
Este es una implementacion de SQL pero enfocada en objetos anidados o objetos json, los cuales tienen estructuras dinámicas y un poco complejas, la característica principal de esta implementacion es la posibilidad de ejecutar consultas similares a SQL donde los filtros información no se enfocan en datos simples, si no al contrario en datos estructurados. Para ejecutar PartiQL debemos descargar el assets ya que no se debe instalar, sin embargo se ejecuta sobre java y necesitan tener la jvm instalada, aqui pueden encontrar los assets y luego simplemente se ejecuta el .bat
Welcome to the PartiQL REPL!
Using version: 0.4.0-e49c55c
PartiQL>
Aquí se puede apreciar un ejemplo, yo puedo tener la siguiente estructura de datos guardada
{
'hr': {
'employees':
{
'id': 3,
'name': 'Bob Smith',
'title': NULL
},
{
'id': 4,
'name': 'Susan Smith',
'title': 'Dev Mgr'
},
{
'id': 6,
'name': 'Jane Smith',
'title': 'Software Eng 2'
}
}
}
donde el documento se llama hr esto en una base de datos relacional se llamaría tabla, apartir de esta estructura yo puedo realizar la siguiente consulta
PartiQL> select employees.id, employees.name from hr.employees;
y obtengo el siguiente resultado
{
'id': 3,
'name': 'Bob Smith'
},
{
'id': 4,
'name': 'Susan Smith'
},
{
'id': 6,
'name': 'Jane Smith'
}
igualmente puedo realizar filtros utilizando el where
PartiQL> select e.id, e.name from hr.employees as e where e.id>5;
y nos retorna el siguiente resultado
{
'id': 6,
'name': 'Jane Smith'
}
otra opción interesante es que se tiene acceso a funciones como count en donde se puede aplicar al siguiente ejemplo, modificando un poco el documento de la siguiente forma
{
'hr': {
'employeesNest':
{
'id': 3,
'name': 'Bob Smith',
'title': NULL,
'projects': [
{
'name': 'AWS Redshift Spectrum querying'
},
{
'name': 'AWS Redshift security'
},
{
'name': 'AWS Aurora security'
}
]
},
{
'id': 4,
'name': 'Susan Smith',
'title': 'Dev Mgr',
'projects': []
},
{
'id': 6,
'name': 'Jane Smith',
'title': 'Software Eng 2',
'projects': [
{
'name': 'AWS Redshift security'
}
]
}
}
}
podríamos generar una consulta para traer la información de los empleados que tengan por lo menos dos proyectos de seguridad o mas
PartiQL> select e.id, e.name from hr.employeesNest e, e.projects as p where p.name like '%security%' group by e.id, e.name having count(*) > 1;
y el resultado seria el siguiente
{
'id': 3,
'name': 'Bob Smith'
}
aqui podría encontrar mas funciones y filtros, ahora vamos a ver un poco de aplicabilidad en una base de datos de AWS no relacional
QLDB
Amazon Quantum Ledger Database es una base de datos como servicio enfocada en guardar la trazabilidad de la información utilizando parte de la tecnología blockhain Ver Figura 2 (para gestionar la inmutabilidad de la información) , es un servicio reciente de AWS por lo tanto desde su SDK no permite usar el servicio como "API REST", para usarlo se debe ejecutar un query en donde se deben utilizar una implementacion de PartiQL que ha hecho AWS, en este caso no es como dynamodb que es opcional, ya que este servicio solo permite la interacion utilizando esta tecnologia, aquí es donde cobra sentido tener un lenguaje basado en SQL ya que no se debe re-aprender nada, si no que se adaptan los conocimientos traídos y se aplican a PartiQL
Veamos un ejemplo ya utilizando QLDB, lo primero es ubicarme en ledger y la table del ledger contra la que realizare la consulta y aquí insertare múltiples datos
insert into logs <<{
"created_at":"2022-08-01",
"os":"linux",
"data":[
{
"FirstName":"Raul",
"LastName":"Lewis",
"DOB":"`1963-08-19T`",
"GovId":"LEWISR261LL",
"GovIdType":"Driver License",
"Address":"1719 University Street, Seattle, WA, 98109"
},
{
"FirstName":"Brent",
"LastName":"Logan",
"DOB":"`1967-07-03T`",
"GovId":"LOGANB486CG",
"GovIdType":"Driver License",
"Address":"43 Stockert Hollow Road, Everett, WA, 98203"
}
],
"provider":{
"id":3,
"name":"Provider Z"
}
},
{
"created_at":"2022-08-01",
"os":"linux",
"data":[
{
"FirstName":"Raul",
"LastName":"Lewis",
"DOB":"`1963-08-19T`",
"GovId":"LEWISR261LL",
"GovIdType":"Driver License",
"Address":"1719 University Street, Seattle, WA, 98109"
},
{
"FirstName":"Brent",
"LastName":"Logan",
"DOB":"`1967-07-03T`",
"GovId":"LOGANB486CG",
"GovIdType":"Driver License",
"Address":"43 Stockert Hollow Road, Everett, WA, 98203"
}
],
"provider":{
"id":4,
"name":"Provider Y"
}
}
>>
lo ejecuto y obtengo el siguiente resultado
el documentid es un identificador que crea QLDB para poder realizar trazabilidad a la información, ahora para verificar que se guardo realizo una consulta o select sobre el table
como se puede apreciar, tengo un registro el cual tiene un atributo data de tipo "JSON object" o dato anidado, el cual permite hacer filtros como veremos a continuación
select * from logs where logs.provider.id>2
ejecuto y obtengo el resultado
incluso puedo usar el like y el count
select * from logs where logs.provider.name like '%Y'
select count(*) as countData from logs
funciones tenemos un montón, las cuales podemos revisar y adaptar a medida que lo necesitemos, finalmente una de las mas importante es la funcion history() que permite hacer trazabilidad a lo que ha sucedido con un registro, en este caso borre un registro pero en el history aun se puede ver
select * from history(logs);
Conclusión
PartiQL es una herramienta que hay que revisarla si trabajas con AWS, pues AWS la esta implementando en la mayoría de sus bases de datos, seguramente con el objetivo de no reinventar un core de consultas para cada servicio, usando esta tecnologia como opcion, por ello como administradores de estos servicios en la nube, conocer que hay en el background del query editor de AWS es importante, pues en el momento de necesitar infomracion compleja ya se tiene el contexto para construir estas consultas