L'ajout d'une version de l'histoire du système de table de base de données
Je suis en train de travailler sur un projet où je dois ajouter un formulaire de contrôle de version de données ou de la fonction de l'historique de chaque tableau. Pour résumer, nous devons garder une trace de chaque insertion ou modification dans la base de données, de sorte qu'il est facile de revenir en arrière ou afficher les versions précédentes des données de chaque table.
La façon dont mon chef de projet envisage ce qui est à faire est d'ajouter quelques nouvelles colonnes de chaque tableau. La principale caractéristique est une coloumn nommé "version". Chaque fois qu'une mise à jour est faite, rien n'est vraiment mis à jour, l'ancienne ligne de en reste qu'une nouvelle ligne est ajoutée à la table avec une valeur incrémentée pour "version".
Pour afficher les données actuelles, on utilise simplement une vue qui affiche uniquement les lignes avec le plus haut numéro de version de chaque type.
Alors que cela fonctionne très bien aussi loin que mouvements de va-et-vient entre les différentes versions, j'ai rencontré un problème avec cette approche. Pour toute relation entre les tables, nous avons besoin de définir les clés étrangères et les clés étrangères ne pouvez référencer des champs uniques dans l'autre table. Maintenant que nous sommes de garder plusieurs versions d'une même ligne (avec le même 'Id' comme c'est fondamentalement le même morceau de données de notre application est concerné), on ne peut plus utiliser d'une autre table 'Id' comme une clé étrangère d'une table.
Nous sommes à l'aide d'un champ clé primaire unique pour chaque ligne, mais ce qui est inutile comme un identificateur depuis plusieurs rangées sont fondamentalement différentes versions de la même chose. Nous avons pu assurer le suivi manuel de la version la plus récente de chaque type d'entrée et de mise à jour correspondante des relations de clé étrangère à chaque fois que quelque chose est changé, mais qui ressemble à beaucoup de travail et je ne suis pas sûr que ce sera toujours le même (par exemple, de revenir à la version précédente d'une entrée peut provoquer la clé étrangère pour faire référence à un vieux et inutilisable version d'une autre entrée dans certains autres de la table.)
Je sais qu'il y a d'autres façons de conserver un historique des mises à jour de la base de données (par exemple en utilisant un tableau de l'historique de chaque tableau), mais je suis coincé avec cette approche dans ce projet.
Est-il plus évident de la façon de gérer les relations entre les tables comme ça que je suis absent?
Note: je suis à l'aide de MS SQL Server 2008 R2.
Vous devez vous connecter pour publier un commentaire.
Il y a un bon article sur le contrôle de version pour MySQL: https://web.archive.org/web/20171216185737/http://blog.jasny.net/articles/versioning-mysql-data/
Je pense que c'est les bases peuvent être facilement appliqués à n'importe quel autre système
Vous dire que voulons pas d'un "séparée de la révision de la table", pas de vote pour FractalizeR la solution car cette. Ok, voici un "tableau de la solution"... Mais, s'il vous plaît, de simplifier/généraliser à votre question, pour des réponses de meilleure qualité et une meilleure utilisation de cette page pour tous les visiteurs: je pense que votre problème est sur le "contrôle de révision" sur les tables SQL.
La solution pour les "ISO 2008 SQL", alors je pense que c'est aussi pour Microsoft SQL-Server. Je l'ai testé sur PostgreSQL 9.1.
Dans ce genre de problème, nous pouvons utiliser un mode SQL pour "émuler" la table d'origine, et la "table versionnée" comme un nouveau, avec plus d'attributs:
* Un nouvel attribut
moment
pour le tri (de la commande) les révisions et pour le temps de l'inscription;* Un nouvel attribut
cmd
"traçabilité" (pas vraiment nécessaire).Supposons que votre original (et classique) de la table est
t
. Pour le contrôle de révision, vous devez ajouter de nouveaux attributs, mais d'autres programmeurs ont pas besoin de voir cette nouvelle attributs... La solution est de renommer la tablet
àt_hist
et de proposer à d'autres programmeurs une VUE SQLt
(comme une requête surt_hist
).t
est une VUE pour afficher une table ordinaire: seuls les cours "tuples".t_hist
est la nouvelle table, avec "l'histoire des tuples".Supposons que
t
avec des attributs a,b.PS: sur
t_hist
j'ai ajoutéisTop
pour de meilleures performances surt
.PS: je vous suggère de ne pas essayer d'adapter cette solution pour une table sans la vue, de votre détente sera très complexe, ni d'essayer de les adapter pour
t_hist
héritert
, où tous les contenus insérés danst_hist
copie det
.