Una base de datos en la que los datos no pueden ser modificados una vez que han sido agregados. Esto significa que todos los datos deben ser validados antes de ser agregados a la base de datos y que cualquier intento de modificar los datos existentes será detectado y rechazado.
Son ideales para aplicaciones que requieren un alto nivel de consistencia y precisión de los datos (como la cronología de un paciente de un hospital), como los sistemas de contabilidad (los datos bancarios) o los sistemas de gestión de riesgos. También puede ser útil en entornos en los que se necesita un control estricto sobre los datos, como los sistemas de seguridad o los sistemas de gestión de la cadena de suministro.
Sus utilidades son varias. En primer lugar, garantizan que los datos sean consistentes y precisos, ya que no pueden ser modificados una vez que han sido agregados. En segundo lugar, simplifican el proceso de respaldar y restaurar los datos, porque siempre se puede volver a la versión original de los datos si es necesario. Finalmente, las bases de datos inmutables pueden simplificar el proceso de auditar y rastrear los cambios, ya que todos los cambios se registran de forma cronológica.
Voy a enseñarte como puedes diseñar una base de datos inmutable. Te ayudará a conocer los entresijos de otras base de datos similares (Datomic, immudb…) y como punto de partida en caso de querer construir una propia.
Principios
- Las filas nunca se actualizan ni se borran, solo se agregan nuevas.
- Disponemos de 2 columnas de control (
id
yrev
), más una extra para los datos llamadadata
. - No hay restricciones en la estructura de datos,
data
, ya que se utilizan diccionarios sin limitaciones en anidaciones. - Un diccionario vacío en
data
, es equivalente a estar eliminado. - Al recuperar información, se devuelve la última revisión (
rev
), ignorandodata
Estructura
id | rev | data |
---|---|---|
Número entero | Número entero | Diccionario |
id
es el identificador único del dato. Se asigna incrementalmente y nunca cambia en las diferentes versiones.rev
indica la revisión del dato. Según se realicen cambios, irá autoincrementándose.data
representa a la información, que será un diccionario sin limitaciones en anidaciones o número de keys.
Ejemplos reales
Agregar
La id
se autoincrementará, rev
siempre empezará por 1 y data
debe contener información.
Se añaden 3 usuarios.
id | rev | data |
---|---|---|
1 | 1 | {"nombre": "María", "edad": 34} |
2 | 1 | {"nombre": "Juan", "edad": 22} |
3 | 1 | {"nombre": "Marcos", "edad": 49} |
Modificar
Para esta acción se agrega una nueva fila donde se mantiene la id
, se autoincrementa rev
y data
cambia.
Se modifica la edad de Juan a 19. A continuación se añade altura a María. Por último, se modifica el nombre de María por Lucia.
id | rev | data |
---|---|---|
1 | 1 | {"nombre": "María", "edad": 34} |
2 | 1 | {"nombre": "Juan", "edad": 22} |
3 | 1 | {"nombre": "Marcos", "edad": 49} |
2 | 2 | {"nombre": "Juan", "edad": 19} |
1 | 2 | {"nombre": "María", "edad": 34, "altura": 165} |
1 | 3 | {"nombre": "Lucia", "edad": 34, "altura": 165} |
Eliminar
Para esta acción se agrega una nueva fila donde se mantiene la id
, se autoincrementa rev
y data
se deja vacía.
Se elimina a Marcos.
id | rev | data |
---|---|---|
1 | 1 | {"nombre": "María", "edad": 34} |
2 | 1 | {"nombre": "Juan", "edad": 22} |
3 | 1 | {"nombre": "Marcos", "edad": 49} |
2 | 2 | {"nombre": "Juan", "edad": 19} |
1 | 2 | {"nombre": "María", "edad": 34, "altura": 165} |
1 | 3 | {"nombre": "Lucia", "edad": 34, "altura": 165} |
3 | 2 | {} |
Consultar
Para esta acción se busca el número más grande de rev
de cada id
. Los diccionarios vacíos de data serán ignorados.
Se consulta todos los usuarios registrados.
id | rev | data |
---|---|---|
2 | 2 | {"nombre": "Juan", "edad": 19} |
1 | 3 | {"nombre": "Lucia", "edad": 34, "altura": 165} |
Apuntes finales
Una buena forma de guardar y recuperar los datos podría ser almacenarlo en un JSON directamente en texto plano. Te ayudará a seguir la traza de los cambios. Además, como puedes comprobar, no debes limitarte a ningún lenguaje de programación. Lo más importante es la arquitectura, el resto ya son preferencias personales.
{{ comments.length }} comentarios