Elimina entità dipendenti

0

Ho una tabella di report temporanea che ha una chiave esterna ( source_id ), ad es. % tabellareport:

| id | val1 | val2 | source_id | | -- | ---- | ---- | --------- | | 1 | 102 | 0.5 | 1 | | 2 | 99 | 0.9 | 1 | | 3 | 212 | 0.1 | 2 |

ed esempio di source tabella:

| id | descr | | -- | ------- | | 1 | source1 | | 2 | source2 | | 3 | source3 |

A causa del design scelto non è possibile eliminare un source contenuto nel report (chiave esterna senza ON DELETE CASCADE ), ad es. impossibile eliminare source1 o source2 ma puoi eliminare source3 . Viene generato un rapporto per un elenco specifico di fonti selezionate dall'utente.

Sto pensando di risolvere questo problema a livello di servizio, ad esempio aggiungere codice che cancella le corrispondenti report righe nel metodo di servizio che elimina un source . Questa è una buona soluzione? Ci sono soluzioni migliori? O forse l'intero design potrebbe essere migliorato?

NOTA: (1) Il report viene generato e memorizzato in una tabella a causa della grande quantità di dati e del tempo di calcolo, rispettivamente lungo. (2) Il report non può essere definito come una vista a causa di alcuni calcoli specifici che non possono essere definiti in SQL.

    
posta Radu Dumbrăveanu 22.11.2018 - 17:04
fonte

1 risposta

1

Il problema

Il riferimento a una fonte in dati temporanei (a scomparsa) ti impedisce di mantenere correttamente i dati di origine permanenti che non sono più rilevanti.

Se elimini dati temporanei corrispondenti a fonti obsolete, potresti creare incoerenze nel rapporto temporaneo e rendere il tuo sistema non affidabile:

  • se ci sono ancora utenti che sfogliano i risultati del rapporto temporaneo.
  • se la cancellazione si verifica accidentalmente durante la generazione del rapporto

Alternativa 1:

Progetta le tue funzioni di reporting in modo tale da eliminare i dati temporanei che non sono più necessari.

Questo risolve il problema alla radice: le fonti non sono bloccate per la cancellazione a causa di dati temporanei che in realtà non sono più necessari. In questo caso, solo le fonti che sono ancora necessarie non possono essere cancellate (e per una giustificata ragione).

Alternativa 2:

Progetta la funzione di cancellazione della sorgente in due passaggi. Innanzitutto, viene impostato un indicatore di eliminazione. Da quel momento in poi, tutte le normali funzioni non mostrerebbero più una fonte contrassegnata: è praticamente cancellata ma ancora presente nella tabella.

Di tanto in tanto eseguire una funzione di pulizia che assomiglia alla funzione di eliminazione di oggi e che elimina tutti gli elementi a cui non si fa più riferimento.

Alternativa 3

Denormalizzare i dati del rapporto temporaneo copiando le informazioni di origine in modo che i dati temporanei siano snapshot autonomi e non si basino su tutto ciò che potrebbe cambiare o scomparire nel frattempo.

Alternativa preferita IMHO, 1 sarebbe l'opzione migliore.

    
risposta data 23.11.2018 - 09:33
fonte

Leggi altre domande sui tag