Je suis sûr que beaucoup d'applications, d'applications critiques, de banques, etc. le font quotidiennement.
L'idée derrière tout cela est:
- toutes les lignes doivent avoir un historique
- tous les liens doivent rester cohérents
- il devrait être facile de faire des demandes pour obtenir des colonnes "actuelles"
- les clients qui ont acheté des objets obsolètes devraient toujours voir ce qu'ils ont acheté même si ce produit ne fait plus partie du catalogue
etc.
Voici ce que je veux faire et je vais vous expliquer les problèmes auxquels je suis confronté.
Toutes mes tables auront ces colonnes:
id
id_origin
date of creation
start date of validity
start end of validity
Et voici les idées pour les opérations CRUD:
- create = insérer une nouvelle ligne avec
id_origin
=id
,date of creation
= now,start date of validity
= now,end date of validity
= null (= signifie que c'est l'enregistrement actif en cours) - mise à jour =
- lire = lire tous les enregistrements avec
end date of validity
== null - mettre à jour l'enregistrement "actuel"
end date of validity
= null avecend date of validity
= maintenant - en créer un nouveau avec les nouvelles valeurs, et
end date of validity
= null (= signifie qu'il s'agit de l'enregistrement actif en cours)
- lire = lire tous les enregistrements avec
- delete = mettre à jour l'enregistrement "actuel"
end date of validity
= null avecend date of validity
= maintenant
Voici donc mon problème: avec les associations plusieurs-à-plusieurs. Prenons un exemple avec des valeurs:
- Tableau A (id = 1, id_origin = 1, start = now, end = null)
- Table A_B (début = maintenant, fin = null, id_A = 1, id_B = 48)
- Tableau B (id = 48, id_origin = 48, start = now, end = null)
Maintenant, je veux mettre à jour la table A, enregistrer id = 1
- Je marque l'enregistrement id = 1 avec fin = maintenant
J'insère une nouvelle valeur dans la table A et ... putain j'ai perdu ma relation A_B à moins que je ne reproduise la relation aussi ... cela finirait par une table:
Tableau A (id = 1, id_origin = 1, start = now, end = now + 8mn)
- Tableau A (id = 2, id_origin = 1, start = now + 8mn, end = null)
- Table A_B (début = maintenant, fin = null, id_A = 1, id_B = 48)
- Table A_B (début = maintenant, fin = null, id_A = 2, id_B = 48)
- Tableau B (id = 48, id_origin = 48, start = now, end = null)
Et ... eh bien j'ai un autre problème: la relation A_B: dois-je marquer (id_A = 1, id_B = 48) comme obsolète ou non (A - id = 1 est obsolète, mais pas B - 48)?
Comment y faire face?
Je dois concevoir cela à grande échelle: produits, partenaires, etc.
Quelle est votre expérience à ce sujet? Comment feriez-vous (comment avez-vous fait)?
-- Éditer
J'ai trouvé cet article très intéressant , mais il ne traite pas correctement de «l'obsolescence en cascade» (= ce que je demande en fait)