2010-10-07 7 views
0

J'ai un problème pour introduire un bon versioning dans ma conception de base de données.Versionnement dans la base de données relationnelle

Faisons un exemple facile. Un petit service de location. Vous avez un tableau Person (P_ID, Name), un tableau Computer (C_ID, Type) et un tableau Rent (R_ID, P_ID, C_ID, FromData, ToData).

Je veux être en mesure de changer le nom d'utilisateur, créer une nouvelle version et toujours avoir l'ancien à portée de main si j'en ai besoin.

Mon but est d'avoir un système sur mes sites web, ce qui facilite la création d'un versionnement de certains enregistrements dans une table.

Plus d'informations:

J'ai la logique métier qui exige que je puisse libérer un record pour une version. Je dois aussi pouvoir revenir aux anciens. La raison en est que je veux exporter pour les versions diffrentes des données.

Répondre

2

Vous avez fait une déclaration (que vous voulez versioning), mais pas une question (exactement quel est votre problème). Sans une question, il est difficile de fournir une réponse.

En général, vous pouvez fournir par versionnage:

  1. Identification quelle entité doit être versionné. Dans ce cas, il semble que vous souhaitiez être un «deal» ou un «contrat de location».

  2. Ajoutez une colonne PK, une colonne de numéro de version et une colonne "originalID" à la table en haut du modèle pour cette entité. Pour effectuer la gestion des versions, copiez l'enregistrement de niveau supérieur dans un nouveau PK, en plaçant le PK d'origine dans la colonne "originalID" et en incrémentant la colonne du numéro de version. Copiez les tables liées, en modifiant le FK dans ces tables pour correspondre au PK du nouvel enregistrement. Ensuite, permettez à l'utilisateur de modifier les enregistrements relatifs à la nouvelle version PK de l'enregistrement.

+0

C'était la première fois que je prenais mais je dis que quelqu'un change ici Nom (dans l'exemple ci-dessus.) Alors vous feriez une nouvelle version dans l'entité principale mais le changement dans la table des noms détruirait l'ancienne version. Dans votre application, mais pour chaque table de plus, il faudrait plus de code d'application.Il doit y avoir un système plus général – nickik

+0

Dans ce cas, l'entité en cours de version est "l'enregistrement d'enregistrement d'utilisateur" Cet enregistrement aurait PK, OriginalPK, et Champs VersionID Lorsque le nom a été modifié, vous créez un nouvel enregistrement avec PK, OriginalPK défini sur OriginalPK sur l'enregistrement "parent" et VersionID incrémenté de 1. Vous ne copieriez pas ou même ne réactualiseriez pas les FK dans la table Contacts transactions (car vous souhaitez conserver la "version" d'origine de l'enregistrement de l'utilisateur associé à la transaction, mais votre interface utilisateur peut indiquer qu'il existe des informations mises à jour pour cet utilisateur.) –

+0

Cest ce que je cherchais merci. – nickik

3

Avant de sauter dans la solution, il pourrait être une bonne idée de demander à ce que le comportement vous êtes désireux d'atteindre? Avez-vous besoin d'un versionnage à des fins d'audit? Avez-vous besoin d'un versionnage pour que les utilisateurs puissent annuler les modifications, avez-vous besoin d'un versionnement pour une règle métier ou y a-t-il une autre raison?

Une fois que vous le savez, la réponse devrait plutôt vous trancher. I.E., Si l'audit est votre but, vous pouvez ajouter des déclencheurs de base de données et stocker les anciennes et nouvelles valeurs dans un tableau séparé [Audit].

+0

Bien dit. Définissez toujours le problème avant de proposer une solution. – Leslie

+0

Ouais ... mais nous l'avons tous fait, devinez c'est pourquoi le codage est tellement amusant – Kane

+0

J'ai ajouté plus d'informations à la question. – nickik

1

Vous pouvez créer une table d'archives que vous mettez à jour via la procédure stockée ou un déclencheur qui est rempli avec une copie de tous les champs d'une ligne de données dans le tableau principal après chaque mise à jour ou insérer. La table d'archivage aurait ses propres PK et horodatages pour les modifications effectuées.

Questions connexes