Sono abbastanza sicuro che molte applicazioni, applicazioni critiche, banche e così via lo facciano ogni giorno.
L'idea alla base di tutto ciò è:
- tutte le righe devono avere una cronologia
- tutti i collegamenti devono rimanere coerenti
- dovrebbe essere facile fare richieste per ottenere colonne "attuali"
- i clienti che hanno acquistato oggetti obsoleti dovrebbero comunque vedere ciò che hanno acquistato anche se questo prodotto non fa più parte del catalogo
e così via.
Ecco cosa voglio fare e spiegherò i problemi che sto affrontando.
Tutti i miei tavoli avranno quelle colonne:
id
id_origin
date of creation
start date of validity
start end of validity
Ed ecco le idee per le operazioni CRUD:
- create = inserisci una nuova riga con
id_origin
=id
,date of creation
= now,start date of validity
= now,end date of validity
= null (= significa che è il record attivo corrente) - aggiornamento =
- read = leggi tutti i record con
end date of validity
== null - aggiorna il record "corrente"
end date of validity
= null conend date of validity
= now - creane uno nuovo con i nuovi valori e
end date of validity
= null (= significa che è il record attivo corrente)
- read = leggi tutti i record con
- delete = aggiorna il record "corrente"
end date of validity
= null conend date of validity
= now
Quindi, ecco il mio problema: con molte associazioni. Facciamo un esempio con i valori:
- Tabella A (id = 1, id_origin = 1, inizio = ora, fine = null)
- Tabella A_B (inizio = ora, fine = null, id_A = 1, id_B = 48)
- Tabella B (id = 48, id_origin = 48, inizio = ora, fine = null)
Ora voglio aggiornare la tabella A, record id = 1
- Contrassegno id record = 1 con end = ora
Inserisco un nuovo valore nella tabella A e ... accidenti ho perso la mia relazione A_B a meno che non duplicassi anche la relazione ... questo finirebbe con una tabella:
Tabella A (id = 1, id_origin = 1, start = now, end = now + 8mn)
- Tabella A (id = 2, id_origin = 1, start = now + 8mn, end = null)
- Tabella A_B (inizio = ora, fine = null, id_A = 1, id_B = 48)
- Tabella A_B (inizio = ora, fine = null, id_A = 2, id_B = 48)
- Tabella B (id = 48, id_origin = 48, inizio = ora, fine = null)
E ... beh, ho un altro problema: la relazione A_B: devo contrassegnare (id_A = 1, id_B = 48) come obsoleto o meno (A - id = 1 è obsoleto, ma non B - 48)?
Come gestirlo?
Devo progettarlo su larga scala: prodotti, partner e così via.
Qual è la tua esperienza al riguardo? Come faresti (come hai fatto)?
-- Modificare
Ho trovato questo articolo molto interessante , ma non tratta correttamente "obsolescenza a cascata" (= cosa sto chiedendo in realtà)