Domanda

Sto cercando di determinare come devo archiviare i dati transazionali storici.

Devo memorizzarlo in una singola tabella in cui il record viene reinserito con un nuovo timestamp ogni volta?

Devo suddividere i dati storici in una tabella "cronologia" separata e mantenere solo i dati correnti nella tabella "attiva".

In tal caso, come posso farlo al meglio? Con un trigger che copia automaticamente i dati nella tabella della cronologia? O con la logica nella mia applicazione?

Aggiornamento per commento di Welbog:

Ci saranno grandi quantità di dati storici (centinaia di migliaia di righe - eventualmente potenzialmente milioni)

Le ricerche e le operazioni di segnalazione verranno eseguite principalmente sui dati storici.

Le prestazioni sono un problema. Le ricerche non dovrebbero essere eseguite tutta la notte per produrre risultati.

È stato utile?

Soluzione

Se il requisito è esclusivamente per la segnalazione, prendere in considerazione la creazione di un data warehouse separato. Ciò consente di utilizzare strutture di dati come le dimensioni che cambiano lentamente, molto migliori per i report storici ma che non funzionano bene in un sistema transazionale. La combinazione risultante inoltre sposta il report storico dal database di produzione, che sarà una vittoria in termini di prestazioni e manutenzione.

Se è necessario che questa cronologia sia disponibile all'interno dell'applicazione, è necessario implementare una sorta di controllo delle versioni o dell'eliminazione logica o rendere tutto completamente controproducente (ovvero le transazioni non vengono mai cancellate, semplicemente annullate e riformulate). Rifletti attentamente se in realtà ti serve perché aumenterà la complessità. Fare un'applicazione transazionale in grado di ricostruire correttamente lo stato storico è considerevolmente più difficile di quanto sembri. I software finanziari (ad esempio i sistemi di sottoscrizione assicurativa) non riescono a farlo molto più di quanto si possa pensare.

Se è necessaria la cronologia esclusivamente per la registrazione di controllo, creare tabelle shadow e trigger di registrazione di controllo. Questo è molto più semplice e robusto rispetto al tentativo di implementare correttamente e in modo completo la registrazione di controllo all'interno dell'applicazione. I trigger prenderanno anche le modifiche al database da fonti esterne all'applicazione.

Altri suggerimenti

Questa domanda va di pari passo con la logica di business. Conosci prima le tue esigenze aziendali, poi inizia da lì. Un data warehouse è una buona soluzione per questo tipo di situazione. ETL ti offrirà molte opzioni per gestire i flussi di dati. Il tuo concetto di base di "Storia" vs "Attivo" è abbastanza corretto. I dati della cronologia saranno più efficienti e flessibili se conservati in un data warehouse con tutte le loro dimensioni e tabelle dei fatti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top