Integrità referenziale in un database in cui le tuple non vengono eliminate fisicamente

1

Molti moderni sistemi di gestione di database relazionali supportano automaticamente l'integrità referenziale, ovvero quando si tenta di cancellare una tupla che ha un riferimento (sotto forma di chiave esterna, ad esempio), il DBMS non completa l'operazione e genera un errore .

Considera un database in cui ogni tabella ha un attributo, che indica se una tupla viene eliminata o meno. Quindi nessun dato viene effettivamente cancellato dal database, ma viene invece contrassegnato come cancellato. Se una tupla è contrassegnata come eliminata, tutti i suoi riferimenti devono essere contrassegnati come eliminati o si dovrebbe verificare un errore. Come può essere supportato?

Sta eseguendo ulteriori verifiche (programmaticamente o con trigger) prima di eliminare una tupla l'unico modo per avere un'integrità referenziale? Ci sono pratiche o algoritmi accettati?

Modifica: questo flag viene utilizzato principalmente per le statistiche e parzialmente per il recupero dei dati dopo un lungo periodo di tempo. È un filtro con un significato speciale, e proprio ora quando vengono eseguite le query, l'integrità referenziale viene verificata direttamente nella query, che è estremamente soggetta a errori e non è affatto affidabile.

    
posta superM 09.01.2013 - 22:29
fonte

2 risposte

1

Se vuoi farlo con solo DRI, non puoi usare solo una bandiera. Oppure puoi, ma non ti piacerà.

Definiamo il tuo "flag eliminato" come un flag di stato Status CHECK IN ('OK', 'Deleted') perché i flag negativi sono confusi. Aggiungi STATUS a ogni tabella e rendilo parte di ogni vincolo FK. In questo modo, ogni riga ha uno stato che deve corrispondere allo stato di qualsiasi cosa a cui è correlato. Ma non sarai in grado di "cancellare" le righe su entrambe le estremità della relazione mentre il vincolo FK è in vigore!

Puoi aggirare il problema usando i trigger al posto del DRI. È un duro lavoro, però, e difficile da ottenere esattamente.

Invece di una colonna flag, definisci coppie di tabelle, una per le righe attive e una per le non attive. Quando una riga di referente deve essere cancellata, prima copiarla e le relative righe sulla tabella non attiva, quindi cancellare per normale. Questo ti dà la possibilità di catturare altri aspetti della cancellazione, come quando, perché e da chi.

    
risposta data 06.02.2013 - 09:59
fonte
0

L'impostazione di un flag "cancellato" su una tupla non elimina effettivamente la tupla, né indica necessariamente la tupla per l'eliminazione effettiva. Il "flag eliminato" fornisce semplicemente un modo per le applicazioni di filtrare i record che sono stati contrassegnati come cancellati.

Quindi l'eliminazione di un record da una tabella con record relativi all'integrità referenziale funziona ancora allo stesso modo. Tutti i record correlati devono ancora essere cancellati (compresi quelli "contrassegnati come cancellati").

Perché si dovrebbe fare questo? Perché il "flag cancellato" consente il recupero banale del record cancellato, semplicemente impostando il suo "flag eliminato" su false. Alcuni sistemi consentono il "ritiro" di tali record rimuovendoli definitivamente dal database dopo un certo periodo di tempo.

    
risposta data 09.01.2013 - 22:38
fonte

Leggi altre domande sui tag