Chismes del Lince 92 · Bases de datos NoSQL
Las mismas lecturas del chisme 91, pero guardadas como documentos que no todos tienen la misma forma. Todo ocurre en tu navegador.
El Lince lleva meses guardando lecturas, pero no todas llegan completas. A veces el sensor de luz no responde, una versión antigua del programa escribe temp en lugar de temperatura, y a veces la micro:bit avisa de que tiene la batería baja. La Gata Montesa le dice: «Las cosas fallan. No podemos parar por eso. Lo que hacemos es guardar lo que llega y saber con qué lo hemos guardado».
1. Elige de dónde vienen los datos
Una mañana de clase inventada, con una lectura por minuto. Casi todas llegan completas, pero de vez en cuando falla algo: el sensor de luz no responde, llega un formato antiguo, hay un aviso de batería o el sensor no contesta.
2. Un documento, una forma
En SQL, cada fila tiene las mismas columnas. En una base de datos de documentos cada registro es un objeto con sus propios campos, escrito en JSON. Estos son los últimos documentos que se han guardado:
(todavía no hay documentos)
La base de datos acepta cualquiera de estas formas. Nadie le ha dicho antes cuál es la forma correcta.
Qué campos tienen los documentos
Un censo de la colección: cuántos documentos tienen cada campo.
3. Pregunta a la colección
En NoSQL el filtro es un objeto JSON: {"campo": {"$gt": 24}}. Los campos que no existen en un documento simplemente no coinciden.
Los operadores del filtro NoSQL
| Operador | Qué hace | Ejemplo |
|---|---|---|
$gt, $gte, $lt, $lte | Mayor, mayor o igual, menor, menor o igual | {"temperatura": {"$gt": 24}} |
$eq, $ne | Igual, distinto | {"luz": {"$ne": 0}} |
$in | Está en la lista | {"sonido": {"$in": [0, 255]}} |
$exists | El campo existe (o no existe, con false) | {"aviso": {"$exists": true}} |
$and, $or | Combina varias condiciones | {"$or": [{"aviso": {"$exists": true}}, {"error": {"$exists": true}}]} |
"a.b" | Campo dentro de otro (anidado) | {"detalle.intentos": {"$gte": 2}} |
4. Lo mismo en una tabla SQL
La tabla lecturas del chisme 91 tiene cuatro columnas fijas. Para compararla, el simulador construye una tabla con los datos de la colección: si un documento tiene temp en lugar de temperatura, lo pone en la columna temperatura, y si le falta un campo, la celda queda como NULL.
En SQL, para preguntar por valores que faltan hay que escribir IS NULL. = NULL no sirve, porque un dato que no existe no es igual a nada.
5. Retos 0/5
Escribe el filtro NoSQL en el editor (con «Documentos (NoSQL)» seleccionado) y pulsa «Comprobar». El reto se da por bueno si devuelve exactamente los documentos esperados.
6. Todos los documentos
7. Qué estamos midiendo realmente
- Un dato que falta no es un cero. Si el sensor de luz no responde, no sabemos la luz que hay: no es que sea 0. Por eso la base de datos guarda «no existe» y no «0».
- Un fallo también es un dato. El documento de error dice que hubo un problema y cuántos intentos se hicieron. Tirarlo haría que los datos parecieran mejores de lo que son.
- Cambiar de formato tiene un precio. Si la versión 1 escribe
tempy la 2 escribetemperatura, cualquier consulta tiene que tenerlo en cuenta. Los datos antiguos no desaparecen; hay que saber que existen. - Estructurado, semiestructurado y no estructurado. Una tabla SQL es estructurada: todas las filas tienen el mismo esquema. Un documento JSON es semiestructurado: tiene etiquetas que describen los datos, pero cada uno puede tener campos distintos. Un texto libre o un audio no tienen estructura.
- Prototipo educativo. Las lecturas de la micro:bit no son medidas de laboratorio.
Glosario
- Documento: un registro que puede tener cualquier conjunto de campos.
- Colección: un conjunto de documentos (aquí,
lecturas). - JSON: formato de texto para datos estructurados con llaves, corchetes, comillas y comas. Lo usan las páginas web y muchas APIs.
- NoSQL: bases de datos que no se basan en tablas con esquema fijo (en inglés «not only SQL»: no solo SQL). Hay de documentos, clave-valor, columnas y grafos.
- Esquema: la descripción de la forma que deben tener los datos. SQL la exige; NoSQL la deja opcional.
- NULL: en SQL, un valor que falta. No es 0 ni texto vacío.
Para el aula
- Toma 60 lecturas en simulación y cuenta a mano cuántos documentos tienen
luz. Comprueba el resultado con el censo. - Escribe el mismo documento en dos formatos: uno con
temperaturay otro contemp. ¿Qué consulta funciona con los dos? - Pregunta lo mismo en NoSQL y en SQL (por ejemplo, las lecturas con temperatura mayor que 24). ¿Dan el mismo número? ¿Por qué?
- ¿Cuándo preferirías una tabla fija y cuándo una colección de documentos? Piensa en una agenda de contactos, en las notas de un alumno y en los datos de una estación meteorológica.
- Diseña un documento para un fallo de un sensor que nunca hemos previsto. ¿Qué campos necesita?
Qué hemos aprendido
Una tabla SQL obliga a decidir antes la forma de todos los datos, y eso la hace muy fiable para preguntas precisas. Una colección de documentos acepta lo que llega, con sus campos y sus fallos, y eso la hace flexible cuando los datos son variados. Ninguna es mejor en todo. Elegir una u otra es una decisión de ingeniería.
Lo importante no es que el Lince deje de medir cuando algo falla. Lo importante es que lo que guarda explique lo que ha pasado.