Estoy bastante seguro de que muchas aplicaciones, aplicaciones críticas, bancos, etc., hacen esto a diario.
La idea detrás de todo eso es:
- todas las filas deben tener un historial
- todos los enlaces deben permanecer coherentes
- debería ser fácil hacer solicitudes para obtener columnas "actuales"
- Los clientes que hayan comprado cosas obsoletas aún deben ver lo que han comprado aunque este producto ya no sea parte del catálogo.
y así.
Esto es lo que quiero hacer, y explicaré los problemas que estoy enfrentando.
Todas mis tablas tendrán esas columnas:
id
id_origin
date of creation
start date of validity
start end of validity
Y aquí están las ideas para las operaciones CRUD:
- crear = insertar nueva fila con
id_origin
=id
,date of creation
= ahora,start date of validity
= ahora,end date of validity
= nulo (= significa que es el registro activo actual) - actualización =
- leer = leer todos los registros con
end date of validity
== nulo - actualizar el registro "actual"
end date of validity
= nulo conend date of validity
= ahora - cree uno nuevo con los nuevos valores y
end date of validity
= nulo (= significa que es el registro activo actual)
- leer = leer todos los registros con
- eliminar = actualizar el registro "actual"
end date of validity
= nulo conend date of validity
= ahora
Así que aquí está mi problema: con asociaciones de muchos a muchos. Tomemos un ejemplo con valores:
- Tabla A (id = 1, id_origin = 1, start = now, end = null)
- Tabla A_B (inicio = ahora, fin = nulo, id_A = 1, id_B = 48)
- Tabla B (id = 48, id_origin = 48, start = now, end = null)
Ahora quiero actualizar la tabla A, id de registro = 1
- Marco id de registro = 1 con end = ahora
Inserto un nuevo valor en la tabla A y ... maldita sea, he perdido mi relación A_B a menos que también duplique la relación ... esto terminaría en una tabla:
Tabla A (id = 1, id_origin = 1, start = now, end = now + 8mn)
- Tabla A (id = 2, id_origin = 1, start = now + 8mn, end = null)
- Tabla A_B (inicio = ahora, fin = nulo, id_A = 1, id_B = 48)
- Tabla A_B (inicio = ahora, fin = nulo, id_A = 2, id_B = 48)
- Tabla B (id = 48, id_origin = 48, start = now, end = null)
Y ... bueno, tengo otro problema: la relación A_B: ¿debo marcar (id_A = 1, id_B = 48) como obsoleto o no (A - id = 1 es obsoleto, pero no B - 48)?
Como lidiar con esto?
Tengo que diseñar esto a gran escala: productos, socios, etc.
¿Cuál es tu experiencia en esto? ¿Cómo lo harías (cómo lo has hecho)?
- Editar
Encontré este artículo muy interesante , pero no trata adecuadamente con la "obsolescencia en cascada" (= lo que estoy preguntando en realidad)