Structure de base de données pour stocker des données historiques

Préface:
Je pensais l'autre jour à propos d'une nouvelle structure de base de données pour une nouvelle application et réalisé que nous avions besoin d'un moyen de stocker l'historique des données de manière efficace. Je voulais quelqu'un d'autre de prendre un coup d'oeil et voir si il y a des problèmes avec cette structure. Je me rends compte que cette méthode de stockage de données peut très bien avoir été inventé avant (je suis presque sûr qu'il y en a) mais je n'ai aucune idée si elle a un nom et quelques recherches sur google que j'ai essayé de ne pas produire quoi que ce soit.

Problème:
Disons que vous avez un tableau pour les commandes, et les commandes sont liés à un client de la table pour le client qui a passé la commande. Dans un normal la structure de base de données que vous pourriez vous attendre à quelque chose comme ceci:

orders
------
orderID
customerID


customers
---------
customerID
address
address2
city
state
zip

Assez simple, orderID a une clé étrangère de code client qui est la clé primaire de la table client. Mais si nous devions nous rendre et exécuter un rapport sur le tableau de commande, nous allons rejoindre la table clients à la table des commandes, qui ramènera l'enregistrement en cours pour que l'ID du client. Si lors de la commande, l'adresse du client est différent et qu'il a été modifié par la suite. Maintenant, notre ordre ne reflète plus l'histoire de l'adresse du client, au moment de la commande. Fondamentalement, par la modification de l'enregistrement du client, nous avons juste changé toute l'histoire de ce client.

Maintenant il y a plusieurs façons de contourner cela, dont l'une serait de copier le dossier lorsqu'une ordonnance a été créé. Ce que j'ai est bien ce que je pense serait un moyen plus facile de faire ce qui est peut-être un peu plus élégant, et a l'avantage supplémentaire de l'exploitation forestière à chaque fois qu'une modification est apportée.

Ce que si je faisais une structure comme ceci à la place:

orders
------
orderID
customerID
customerHistoryID


customers
---------
customerID
customerHistoryID


customerHistory
--------
customerHistoryID
customerID
address
address2
city
state
zip
updatedBy
updatedOn

s'il vous plaît pardonnez la mise en forme, mais je pense que vous voyez l'idée. Fondamentalement, l'idée est qu'à chaque fois qu'un client est changé, d'insertion ou de mise à jour, la customerHistoryID est incrémenté et la table clients est mis à jour avec les dernières customerHistoryID. Le tableau de commande maintenant, non seulement les points pour le code client (qui vous permet de voir toutes les révisions de la fiche client), mais aussi à la customerHistoryID, qui pointe à une révision particulière de l'enregistrement. Aujourd'hui, cet ordre reflète l'état des données au moment où l'ordre a été créé.

Par l'ajout d'une updatedby et updatedon colonne à la customerHistory table, vous pouvez également voir une "du journal d'audit" des données, de sorte que vous pourriez voir qui a fait les changements et quand.

Un potentiel de baisse pourrait être supprime, mais je ne suis pas vraiment inquiet à propos de ce besoin que rien ne doit jamais être supprimé. Mais même encore, le même effet peut être obtenu en utilisant un activeFlag ou quelque chose comme cela en fonction sur le domaine des données.

Ma pensée est que toutes les tables à utiliser cette structure. À tout moment l'historique des données est en cours de récupération, il serait jointe à l'encontre de l'histoire de la table à l'aide de la customerHistoryID pour afficher l'état des données de cette commande.

Récupération d'une liste de clients est facile, il suffit de se joindre à la table des clients sur le customerHistoryID.

Quelqu'un peut voir les problèmes avec cette approche, à partir d'un point de vue design, ou la performance des raisons pourquoi c'est mauvais. Rappelez-vous, peu importe ce que je fais j'ai besoin pour s'assurer que les données historiques sont préservées, de sorte que par la suite, les mises à jour des enregistrements de ne pas changer l'histoire. Est-il un meilleur moyen? Est-ce une vieille idée qui a un nom, ou de toute documentation à ce sujet?

Merci pour toute aide.

Mise à jour:
C'est un exemple très simple de ce que je vais vraiment avoir. Mon application réelle aura des "ordres" avec plusieurs clés étrangères vers d'autres tables. Origine/de destination de l'information, information de la clientèle, renseignements sur l'installation, l'utilisateur de l'information, etc. Il a été suggéré une couple de fois que j'ai pu copier les informations dans l'ordre à ce point, et j'ai vu faire de cette façon beaucoup de temps, mais il en résulterait un enregistrement avec des centaines de colonnes, ce qui n'est vraiment pas possible dans ce cas.

source d'informationauteur Ryan Guill