207 votes

Comment contrôler la version d'un enregistrement dans une base de données

Disons que j'ai un enregistrement dans la base de données et que les utilisateurs administrateurs et normaux peuvent effectuer des mises à jour.

Quelqu'un peut-il suggérer une bonne approche / architecture pour contrôler la version de chaque modification dans ce tableau afin de pouvoir restaurer un enregistrement dans une révision précédente.

195voto

WW. Points 11335

Disons que vous avez un FOO tableau que les administrateurs et les utilisateurs peuvent mettre à jour. La plupart du temps, vous pouvez écrire des requêtes sur la table FOO. Les jours heureux.

Ensuite, je voudrais créer un FOO_HISTORY table. Cela a toutes les colonnes de la FOO table. La clé primaire est le même que FOO plus un RevisionNumber colonne. Il y a une clé étrangère d' FOO_HISTORY de FOO. Vous pouvez également ajouter des colonnes liées à la révision tels que le nom d'utilisateur et RevisionDate. Remplir le RevisionNumbers dans un nombre toujours croissant de la mode au travers de toute l' *_HISTORY tables (ie. à partir d'une séquence Oracle ou équivalent). Ne comptez pas sur il y a seulement un changement dans une seconde. c'est à dire. ne pas mettre d' RevisionDate dans la clé primaire.

Maintenant, chaque fois que vous mettez à jour FOO, juste avant de vous faire la mise à jour vous insérez les anciennes valeurs en FOO_HISTORY. Vous faites cela à un certain niveau fondamental dans votre conception de sorte que les programmeurs ne peuvent pas accidentellement sauter cette étape.

Si vous souhaitez supprimer une ligne d' FOO , vous avez quelques choix. Soit en cascade et de supprimer toute l'histoire, ou d'effectuer une suppression logique par le repérage FOO comme supprimé.

Cette solution est bonne lorsque vous êtes principalement intéressé par les valeurs actuelles et seulement de temps en temps dans l'histoire. Si vous avez toujours besoin de l'histoire, alors vous pouvez mettre effective de début et dates de fin et de conserver tous les enregistrements dans FOO intself. Chaque requête doit ensuite vérifier ces dates.

51voto

CMS Points 315406

Je pense que vous êtes à la recherche pour la gestion des versions le contenu des enregistrements de base de données (comme StackOverflow n'quand quelqu'un modifie une questrion/réponse) un bon point de départ pourrait être de regarder certains modèle de base de données qui utilise cette révision de suivi.

Le meilleur exemple qui me vient à l'esprit, je pense, est de MediaWiki (Wikipedia moteur), regarde le schéma de base de données ici, vérifier comment la révision de la table de son.

Selon quelles sont les technologies que vous utilisez, vous aurez à trouver quelques bonnes diff/merge algorithmes.

Vérifier à cette question, si c'est pour .NET.

38voto

ranomore Points 1718

Dans la BI monde, vous pourriez faire cela par l'ajout d'une date de début et date de fin de la table que vous voulez version. Lorsque vous insérez le premier enregistrement dans la table, la date de début est rempli, mais la date de fin est nulle. Lorsque vous insérez le deuxième enregistrement, vous pouvez également mettre à jour la date de fin du premier enregistrement avec la date de début de l'enregistrement du second.

Lorsque vous souhaitez afficher l'enregistrement en cours, vous choisissez celui où la date de fin est nulle.

Cela est parfois appelé une de type 2 de Dimension à variation lente. Voir aussi TupleVersioning

10voto

D3vtr0n Points 1653

Mise à niveau vers SQL 2008.

Essayez d’utiliser le suivi des modifications SQL, SQL 2008. Au lieu de l’horodatage et la pierre tombale hacks de colonne, vous pouvez utiliser cette nouvelle fonctionnalité pour le suivi des modifications sur les données dans votre base de données.

MSDN SQL 2008 suivi des modifications

4voto

bart Points 3543

Vous ne dites pas ce que la base de données, et je ne vois pas dans le post tags. Si c'est pour Oracle, je peux recommander l'approche qui est intégré dans le Concepteur: utiliser les tables du journal. Si c'est pour une toute autre base de données, et bien, en gros, je recommande la même manière, trop...

La manière dont il fonctionne, dans le cas où vous souhaitez le reproduire dans une autre base de données, ou peut-être si vous voulez juste de comprendre, c'est que pour une table n'est plus que l'ombre de la table créée trop, juste normale table de base de données, avec le même champ de cahier des charges, en plus de certains champs supplémentaires: à l'instar de ce que l'action a été la dernière prise (chaîne des valeurs typiques "INS" pour les insérer, "UPD" pour mettre à jour et "SUPPR" pour supprimer), datetime lorsque l'action a eu lieu, et l'id utilisateur pour qui l'a fait.

Par le biais de déclencheurs, chaque action à une ligne dans la table insère une nouvelle ligne dans la table de revue avec les nouvelles valeurs, quelles mesures ont été prises, quand et par quel utilisateur. Vous n'avez pas jamais supprimer des lignes (au moins pas pour les quelques derniers mois). Oui, il va pousser de gros, facilement des millions de lignes, mais vous pouvez facilement le suivi de la valeur pour tout enregistrer à n'importe quel point dans le temps depuis la journalisation commencé ou l'ancien journal rangées ai purgé dernier, et qui a fait la dernière modification.

Dans Oracle tout ce dont vous avez besoin est générée automatiquement en code SQL, tout ce que vous avez à faire est de compiler/exécuter, et il est livré avec un CRUD de base de l'application (en fait, seul "R") pour l'inspecter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X