Bases de datos bitemporales, la máquina del tiempo de las bases de datos

En ocasiones, por requerimientos del negocio, necesitamos gestionar información compleja relacionada con el tiempo y sus históricos.
En este contexto las bases de datos bitemporales pueden ser nuestra solución. Estas bases de datos están diseñadas para manejar dos tipos de dimensiones temporales (de ahí el nombre): tiempo de validez del dato y tiempo de validez de la transacción. Esta doble capacidad temporal permite un seguimiento más preciso y exhaustivo de los datos, lo que convierte a las bases de datos bitemporales en una potente herramienta para diversas aplicaciones, como sistemas financieros, asistencia sanitaria o registros legales.

¿Cómo se compone?

Como ya hemos comentado, la base de datos bitemporal es un tipo de base de datos que admite dos dimensiones temporales:

Tiempo de validez: El periodo de tiempo durante el cual un hecho es verdadero en el mundo real.

Tiempo de transacción: el periodo de tiempo durante el cual se registró el hecho en la base de datos.

Al incorporar tanto el tiempo válido como el tiempo de transacción, las bases de datos bitemporales pueden proporcionar un registro histórico completo de los cambios en los datos.
Este doble seguimiento temporal permite una representación más matizada y precisa de los datos a lo largo del tiempo, permitiendo a los usuarios ver los datos tal y como eran en cualquier momento del pasado, como una máquina del tiempo de los valores en la base de datos.

El poder de la modelización bitemporal

La modelización bitemporal ofrece varias ventajas clave:

Precisión histórica: Mantienen un historial completo de los cambios en los datos, lo que permite un análisis histórico preciso.

Integridad de los datos: Las bases de datos bitemporales garantizan la integridad y coherencia de los datos gracias al seguimiento de los tiempos de validez y de transacción.

Registros de auditoría completos: Todos los datos se vuelven inmutables, lo que permite un seguimiento exhaustivo de los cambios.

Corrección de errores: Los errores pueden corregirse sin perder el historial de lo registrado anteriormente.

Cumplimiento de la normativa: Muchos sectores requieren registros históricos precisos para cumplir la normativa. Las bases de datos bitemporales pueden ayudar a cumplir estos requisitos.

Ejemplo de Casos de Uso

Sistemas financieros

En los sistemas financieros, las bases de datos bitemporales pueden rastrear el historial de transacciones y saldos de cuentas. Por ejemplo, si un banco necesita auditar una cuenta, puede utilizar la base de datos bitemporal para ver el saldo de la cuenta en cualquier momento (y los cambios intermedios), tanto cuando se produjo la transacción como cuando se registró.

Sanidad

En sanidad, los historiales de los pacientes deben ser precisos y estar actualizados. Las bases de datos bitemporales pueden hacer un seguimiento de los cambios en la información del paciente, como diagnósticos y tratamientos, garantizando que los profesionales sanitarios tengan acceso a la información más precisa y completa.

Educación

Disponer de una trazabilidad de los expedientes académicos de los estudiantes, permite conocer como ha ido evolucionando en los estudios y poder saber si ha habido ajustes en las valoraciones de las notas debido a revisiones o errores. A nivel legal, un cambio en una nota puede significar poder entrar al siguiente nivel de educación o no.

Registros jurídicos

Los registros jurídicos suelen requerir datos históricos precisos. Las bases de datos bitemporales pueden rastrear cambios en documentos legales, como contratos y sentencias judiciales, proporcionando un historial completo de cuándo se realizaron los cambios y cuándo fueron válidos.

Estructura de datos bitemporal

Una tabla bitemporal típica puede incluir las siguientes columnas:

Entidad ID

Valor del atributo

Hora de inicio válida

Hora de fin de validez

Hora de inicio de la transacción

Hora de finalización de la transacción

Entity ID | Attribute Value | Valid Start | Valid End | Transaction Start | Transaction End
1 | Value A | 01-01-2024 | 15-03-2024 | 01-01-2024 | 15-03-2024
1 | Value B | 15-03-2024 | 31-12-9999 | 15-03-2024 | 31-12-9999

En este ejemplo, el atributo de la entidad se registró inicialmente como «Valor A» el 1 de enero de 2024. El 15 de marzo de 2024, se actualizó a «Valor B». La estructura bitemporal nos permite ver tanto el valor actual como el histórico.

¿Y por qué las dos columnas de «Válido» y «Transacción»? Para entenderlo mejor, veamos algunos ejemplos.

Veamos un escenario, por ejemplo, en el que tenemos que llevar la cuenta de los diagnósticos de enfermedades.

En este caso, a un paciente se le diagnosticó inicialmente gripe el 10 de abril. Sin embargo, el 20 de abril, el diagnóstico fue revisado a neumonía, con el tiempo válido retrocedido a la visita original. Esta estructura bitemporal permite a los profesionales sanitarios ver tanto el diagnóstico inicial como el corregido, lo que resulta crucial para comprender el historial de tratamiento del paciente.

Patient ID | Diagnosis | Valid Start | Valid End | Transaction Start | Transaction End
P001 | Flu | 10-04-2024 | 15-04-2024 | 10-04-2024 | 20-04-2024
P001 | Pneumonia | 10-04-2024 | 25-04-2024 | 20-04-2024 | 31-12-9999

Veamos un ejemplo algo más complejo.

Imaginemos que trabajamos en una entidad financiera y partimos de un balance de 1000 el 1 de Junio de 2024. El día 5, por error se actualiza el balance a 1500. El día 7, nos damos cuenta del error, y es que no se han ingresado 500 de una sola vez, sino que se han ingresado 200 el dia 3 de junio y 300 el dia 5 de Junio. Esto lo podríamos guardar como:

Account ID | Balance | Valid Start | Valid End | Transaction Start | Transaction End
12345 | 1000 | 01-06-2024 | 05-06-2024 | 01-06-2024 | 07-06-2024
12345 | 1500 | 05-06-2024 | 31-12-9999 | 05-06-2024 | 07-06-2024
12345 | 1000 | 01-06-2024 | 03-06-2024 | 07-06-2024 | 31-12-9999
12345 | 1200 | 03-06-2024 | 05-06-2024 | 07-06-2024 | 31-12-9999
12345 | 1500 | 05-06-2024 | 31-12-9999 | 07-06-2024 | 31-12-9999

Con esto, si alguien sacó un reporte el dia 4 de junio, esta persona debería tener en cuenta 1200, pero solo le aparecerian 1000, puesto que la actualización erronea se realizó el dia 5, pero si a día 8 de junio realizara el report de cuanto dinero habia en cuenta a día 4, ahora saldria correcto, puesto que la cantidad 1200 es la valida por las columnas valid start-end y por la validez de las columnas transaction start and end. De esta manera queda todo controlado sabiendo las cantidades que aparecerian en cada fecha y si aún son validas o no.

Está claro que las bases de datos bitemporales ofrecen una potente solución para gestionar datos históricos con exactitud y precisión. Al rastrear tanto el tiempo válido como el tiempo de transacción, proporcionan un registro histórico completo y preciso, lo que las hace inestimables para una gran variedad de aplicaciones.