Altamar Labs
Volver a Blog
arquitectura· 3 min de lectura

Diseñar para la auditabilidad desde el modelo de datos, no como una capa de reportes

Cuando un negocio necesita responder 'qué pasó con esto exactamente', la respuesta no puede depender de reconstruir la historia después. Tiene que estar en cómo se modelaron las entidades desde el principio.

Hay una pregunta que, en ciertos negocios, se hace con más frecuencia de la que cualquier equipo de ingeniería anticipa: "¿qué pasó exactamente con esto?". No "cuál es el estado actual", sino la cadena completa de eventos que llevó hasta ese estado. Cuando el modelo de datos no fue diseñado pensando en esa pregunta, responderla se convierte en arqueología de logs dispersos, en el mejor caso, o en una reconstrucción imposible, en el peor.

Por qué el estado actual no es suficiente

La mayoría de modelos de datos se diseñan para responder "¿cómo está esto ahora?": un pedido tiene un estado, un paquete tiene una ubicación actual, una cuenta tiene un saldo. Esa información es necesaria, pero es fundamentalmente distinta de "¿cómo llegó a estar así?", que requiere conservar la secuencia completa de transiciones, no solo el resultado final.

Un negocio que mueve mercancía física a través de varias etapas (un proveedor entrega algo, pasa por una operación intermedia, se agrupa en un envío, viaja en una ruta) necesita poder reconstruir esa cadena completa después del hecho, ya sea para resolver una disputa con un cliente, para cumplir un requisito de facturación, o simplemente porque algo salió mal y hay que entender en qué punto exacto ocurrió.

La diferencia entre guardar el estado y guardar la historia

Modelar solo el estado actual, con una columna que se sobrescribe cada vez que algo cambia, es más simple de implementar y suficiente para la mayoría de funcionalidades del día a día. Pero es una decisión que, tomada sin pensar, elimina información que después resulta imposible de recuperar: si el estado de un paquete cambió tres veces en un día, un modelo que solo guarda el estado actual no tiene forma de saber que esos tres cambios ocurrieron, ni cuándo, ni por qué.

La alternativa no es complicar cada tabla con una bitácora genérica de cambios. Es identificar, desde el diseño del dominio, qué entidades son las que un negocio realmente va a necesitar auditar, y modelar esas específicamente como una cadena de eventos inmutables en vez de un registro mutable. Cada paso de esa cadena (recibido, agrupado, despachado, entregado) se convierte en un hecho que ya ocurrió y que no se sobrescribe, en lugar de un campo de estado que solo refleja el presente.

El costo de no hacerlo a tiempo

Añadir auditabilidad después, sobre un modelo que ya solo guardaba estado, es mucho más caro que diseñarla desde el principio. No es un cambio de esquema trivial, es un cambio de la forma en que el sistema entero piensa sobre sus propias entidades: de "esto es lo que hay ahora" a "esto es todo lo que pasó para llegar hasta aquí". Migrar esa forma de pensar a mitad de la vida de un producto, con datos ya en producción y sin historial previo que reconstruir, es en la práctica imposible: la historia que no se guardó no se puede recuperar retroactivamente.

La lección

La auditabilidad no es una feature que se agrega. Es una propiedad del modelo de datos que se decide, o se pierde, en el momento en que se diseñan las tablas. Para negocios donde la trazabilidad no es opcional (logística, pagos, cualquier sistema regulado), la pregunta correcta al modelar una entidad no es solo "¿qué campos necesita?", sino "¿alguien, en algún momento, va a necesitar reconstruir cómo llegó hasta aquí?". Si la respuesta es sí, esa entidad necesita ser una cadena de eventos, no una fila que se sobrescribe.