Pensé en una estructura de base de datos poco común y me pregunto si alguien la ha visto en uso antes. Básicamente está usando 2 bases de datos:
- La primera base de datos contiene solo los datos actualmente válidos
- La segunda base de datos contiene el historial de todo lo que se ha ingresado, actualizado o eliminado en la primera base de datos
Guión
Estoy trabajando en un proyecto donde debo registrar todo lo que sucede y donde los datos cambian con frecuencia.
Ejemplo (no el real)
Tienes que hacer el diseño de la base de datos para una liga de fútbol. En esta liga hay jugadores y equipos. Los jugadores a menudo cambian de equipo.
- Primer requisito : la base de datos debe contener la información necesaria para jugar el próximo partido. Esto significa una lista de todos los jugadores, equipos y en qué equipo está actualmente cada jugador.
- Segundo requisito : la base de datos debe contener valores históricos que usaremos para generar estadísticas. Esto significa la lista de todos los jugadores que han sido parte de un equipo o la lista de todos los equipos de los que un jugador ha sido parte.
El problema
Estos dos requisitos son un poco opuestos entre sí. He intentado hacer todo en la misma base de datos pero no tiene sentido. El primer requisito solo se preocupa por "jugar el próximo partido", mientras que el segundo requisito solo se preocupa por "generar estadísticas".
Para hacer todo en la misma base de datos, utilicé una especie de base de datos "insertar solo" usando la eliminación suave obvia para eliminar / actualizar información ...
Lo que inicialmente parecía una tarea fácil, tener una lista de jugadores, equipos y el equipo actual de cada jugador, de repente se vuelve mucho más difícil. La lógica de la aplicación requerida para jugar la próxima partida ya es lo suficientemente complicada, pero ahora la base de datos tiene un diseño muy poco útil en el que se requiere que la aplicación agregue una verificación "se elimine" en cada consulta solo para jugar la próxima partida.
¿Te gustaría ser ese entrenador que grita "todos los jugadores del equipo, ven a mí" y luego 2000 jugadores vienen a ti. En ese momento, probablemente gritarás "todos los jugadores que no están eliminados en el equipo, ven a mí" (mientras juras sobre este estúpido diseño).
Mi conclusión
Llegué a preguntarme por qué necesitas poner todo en la misma base de datos. La eliminación suave no solo hace un mal trabajo al registrar todo a menos que agregue muchas columnas (time_created, who_created_it, time_deleted, who_deleted_it) sino que también complica todo. Complica el diseño de la base de datos y complica el diseño de la aplicación.
Además, recibo estos 2 requisitos como parte de una sola aplicación que no se puede dividir, pero sigo pensando: se trata de 2 aplicaciones completamente distintas. ¿Por qué estoy tratando de hacer todo juntos?
Fue entonces cuando pensé en dividir la base de datos en dos. Una base de datos operativa que se usa solo para jugar el próximo partido y solo contiene la información que es actualmente válida y una base de datos histórica que contiene toda la información que existió alguna vez, cuando se creó, se eliminó y quién lo hizo.
El objetivo es mantener la primera base de datos (operativa) y la aplicación lo más simple posible mientras se tiene tanta información como sea posible en la segunda base de datos (histórica).
Preguntas
- ¿Has visto ese diseño antes? ¿Tiene nombre?
- ¿Hay algún obstáculo obvio que me estoy perdiendo?
EDITAR 2015-03-16
Arquitectura actual
Básicamente, puede pensar en toda la arquitectura como un proceso de 2 pasos.
Paso 1 :
- La aplicación se está ejecutando y los usuarios están realizando algunas acciones.
- Cada vez que ocurre un evento, se registra automáticamente (solución de auditoría) en una tabla de eventos
- Luego se actualiza la fila correcta, en la base de datos operativa
Paso 2 :
- Un trabajo lee la última inserción en la tabla de eventos e inserta estos nuevos datos en la base de datos histórica.
- Los usuarios consultan la base de datos histórica para recuperar la información que necesitan.
Solo desde la tabla de eventos, puede reconstruir la información en cualquier momento. El problema es que esta tabla de eventos no es fácilmente consultable. Aquí es donde entra en juego la base de datos histórica; presentar los datos de manera que sea fácil recuperar exactamente lo que queremos.
Problemas adicionales al poner todo en las mismas tablas
Ya he expresado mi preocupación por la complejidad adicional de marcar "se elimina" en cada consulta. Pero hay otro problema: la integridad .
Hago un uso intensivo de la clave externa y la restricción para asegurarme de que en cualquier momento, los datos que están en mi base de datos sean válidos.
Veamos un ejemplo :
Restricción: solo puede haber un arquero por equipo.
Es fácil agregar un índice único que verifique si solo hay un arquero por equipo. Pero entonces, ¿qué sucede cuando cambias el portero? Aún necesita conservar la información sobre la anterior, pero ahora tiene 2 porteros en los mismos equipos, uno activo y otro inactivo, lo que contradice su restricción.
Claro que es fácil agregar un cheque a su restricción, pero es otra cosa para administrar y pensar.