In SQL Server 2008+, vorremmo abilitare il tracciamento delle modifiche cronologiche a una tabella "Clienti" in un database operativo.e Dimensione di modifica di tipo 2
È un nuovo tavolo e la nostra app controlla tutti gli scritti sul database, quindi non abbiamo bisogno di hack maligni come i trigger. Costruiremo invece il rilevamento delle modifiche nel nostro livello di oggetto aziendale, ma è necessario individuare lo schema del database corretto da utilizzare.
Il numero di righe sarà inferiore a 100.000 e il numero di modifiche per record sarà pari a 1,5 l'anno.
Ci sono almeno due modi che abbiamo preso in esame modellare questo:
Come un tavolo Type 2 Slowly Changing Dimension chiamato
CustomersHistory
, con colonne perEffectiveStartDate
,EffectiveEndDate
(impostatoNULL
per la versione corrente del cliente) e auditing di colonne comeChangeReason
eChangedByUsername
. Quindi creiamo una vistaCustomers
su quel tavolo che viene filtrata suEffectiveEndDate=NULL
. La maggior parte delle parti della nostra app interrogherebbe usando quella vista, e solo le parti che devono essere a conoscenza della storia interrogheranno la tabella sottostante. Per prestazioni, potremmo materializzare la vista e/o aggiungere un indice filtrato su EffectiveEndDate = NULL.Con una tabella di controllo separata. Ogni modifica a un record
Customer
scrive una volta sulla tabellaCustomer
e di nuovo su una tabella di controlloCustomerHistory
.
Da una rapida rassegna delle domande StackOverflow, il numero 2 sembra essere molto più popolare. Ma questo è dovuto al fatto che la maggior parte delle app DB ha a che fare con scrittori legacy e canaglia?
Dato che stiamo iniziando da una lavagna vuota, quali sono i pro e i contro di entrambi gli approcci? Quale raccomanderesti?
È un database OLTP non un data warehouse separato, ma la tabella in questione non cambia molto spesso. –
Immagino che un'operazione comune nell'applicazione mostri un elenco delle transazioni del cliente. SCD 2 renderà necessario un join aggiuntivo ogni volta: 'CustomersCurrentView WHERE Customer = 'John Doe' UNISCITI a CustomerHistory JOIN Transactions'. Il mio suggerimento è: se i dati storici non vengono utilizzati spesso, conservare una serie di tabelle di controllo separate; considera SCD 2 solo se i componenti che supportano la cronologia costituiscono una parte importante dell'applicazione. +1 per una domanda molto interessante! –