Progettazione di un sistema per archiviare i database con integrità referenziale

3

Ho un database Oracle molto grande, con molte tabelle e milioni di righe. Devo cancellare alcune delle righe end-to-end. Per end-to-end, voglio dire, se voglio cancellare una riga da una tabella, devo prima cancellare tutti i record corrispondenti nelle tabelle figlio e assicurarmi che l'eliminazione avvenga senza errori di violazione del vincolo durante l'eliminazione della voce della tabella genitore.

Ad esempio:

Table A defines dependency over Table B and Table C (means Table A has foreign key constraint on Table B and Table C).
Table B defines dependency over Table C and Table D.

Voglio eliminare le righe in questo ordine specifico come segue:

Tabella A < = Tabella B < = Tabella C < = Tabella D

Ho trovato due approcci:

  1. Utilizzo di un'API del servizio che accetta la riga padre della tabella e archivia tutti i dati nel formato JSON e continua a eliminare la voce utilizzando l'opzione cascade.

  2. Un'altra opzione è usare delete-with-cascade insieme ai trigger per salvare i valori cancellati.

Una volta che i dati sono stati recuperati, voglio inserirli meglio in tabelle archiviate simili, Table_A_archived, Table_B_archived etc o Se può essere scaricato nel file, va bene anche così.

Qualche idea sugli approcci iniziali sarà davvero preziosa. Se qualcuno ha già fatto questo tipo di cose prima, sarà fantastico imparare dalla loro esperienza.

Solo FYI, questo è un database live e non posso fare cose assurde (posso ovviamente testarlo prima di spingerlo a prod :)). Inoltre, la cancellazione / archiviazione non è solo sulla base del tempo.

Grazie in anticipo!

    
posta instanceOfObject 05.11.2014 - 07:40
fonte

2 risposte

2

Lo spostamento dei dati nelle tabelle di archiviazione ridurrà la quantità di dati nelle "tabelle live", ma non ridurrà la dimensione complessiva del database. Quindi, se questo è il tuo obiettivo, usa i file, che possono essere facilmente compressi se necessario.

Tuttavia, se vuoi essere in grado di interrogare i tuoi dati di archivio in un secondo momento, e la dimensione del database non è proprio il tuo problema, le tabelle di archivio potrebbero essere la scelta migliore.

L'uso dei trigger fa sì che IMHO abbia senso solo se il processo di archiviazione deve avvenire in modo sincrono durante il processo di produzione (ad esempio, ogni volta che viene inviato un comando DELETE ai dati nella normale produzione, si desidera archiviare immediatamente i relativi record). ). D'altra parte, se il processo di archiviazione è progettato per essere un processo asincrono, magari eseguito alle ore del dopo-lavoro, con un filtro del timestamp per l'identificazione dei dati da archiviare, non è necessario utilizzare i trigger. Invece, puoi progettare il processo di archiviazione utilizzando alcune eliminazioni collettive, che possono essere notevolmente più veloci dell'eliminazione di un record dopo l'altro.

    
risposta data 06.11.2014 - 16:51
fonte
2

Utilizza le tabelle di archivio e utilizza un trigger per archiviare il record nella tabella di archivio. Questi trigger possono essere generati a livello di codice dalla definizione della tabella.

Quindi puoi semplicemente cancellare i record con l'opzione cascade e sapere che l'archivio viene creato automaticamente.

    
risposta data 05.11.2014 - 13:53
fonte

Leggi altre domande sui tag