Dans SQL Server 2008+, nous souhaitons activer le suivi des modifications historiques dans une table "Customers" dans une base de données opérationnelle.Table d'audit et type 2 Modification lente de la cote
C'est une nouvelle table et notre application contrôle toutes les écritures dans la base de données, donc nous n'avons pas besoin de hacks maléfiques comme des triggers. Au lieu de cela, nous allons construire le suivi des modifications dans notre couche d'objet métier, mais nous devons trouver le bon schéma de base de données à utiliser.
Le nombre de lignes sera inférieur à 100 000 et le nombre de changements par enregistrement sera en moyenne de 1,5 par an.
Il y a au moins deux façons que nous avons cherché à modéliser ceci:
Comme une table Type 2 Slowly Changing Dimension appelée
CustomersHistory
, avec des colonnes pourEffectiveStartDate
,EffectiveEndDate
(mis àNULL
pour la version actuelle du client), et auditer des colonnes commeChangeReason
etChangedByUsername
. Ensuite, nous construirions une vueCustomers
sur cette table qui est filtrée enEffectiveEndDate=NULL
. La plupart des parties de notre application interrogeraient en utilisant cette vue, et seules les parties qui doivent être sensibles à l'historique interrogeraient la table sous-jacente. Pour les performances, nous pourrions matérialiser la vue et/ou ajouter un index filtré sur EffectiveEndDate = NULL.Avec une table d'audit séparée. Chaque modification apportée à un enregistrement
Customer
écrit une fois dans la tableCustomer
et à nouveau dans la table de vérificationCustomerHistory
.
D'après un examen rapide des questions StackOverflow, # 2 semble être beaucoup plus populaire. Mais est-ce parce que la plupart des applications DB doivent faire face à des écrivains hérités et voyous? Étant donné que nous partons d'une liste vierge, quels sont les avantages et les inconvénients de l'une ou l'autre approche? Lequel recommanderiez-vous?
Il s'agit d'une base de données OLTP qui n'est pas un entrepôt de données distinct, mais la table en question ne change pas très souvent. –
J'imagine qu'une opération courante dans l'application montrera une liste de transactions du client donné. SCD 2 créera une jointure supplémentaire nécessaire à chaque fois - 'CustomersCurrentView WHERE Client = 'John Doe' JOIN CustomersHistory JOIN Transactions '. Ma suggestion est la suivante: si les données historiques ne sont pas souvent utilisées, conservez un ensemble de tables de vérification distinctes; considérez SCD 2 uniquement si les composants sensibles à l'historique constituent une partie importante de l'application. +1 pour une question très intéressante! –