2010-05-14 4 views
1

est ici l'affaire/défi,Design Pattern - Complexe multiobjets Versioning w/hors-séquence sensibilisation

Nous devons garder une trace des informations et il est des changements linéaires. Nous devons également garder une trace des changements qui sont hors séquence. Par exemple A est arrivé alors B est arrivé. Quelque temps plus tard, nous apprenons que C est réellement arrivé avant B. En plus de ce défi, nous avons beaucoup d'objets qui doivent être versionnés et liés les uns aux autres. Si c'était une seule table/objet qui devait être versionné ... pas de problème. Mais, avec plusieurs objets, nous entrons maintenant dans des liens plus complexes. Et, jeter le concept d'événements hors séquence ne fait que compliquer les choses.

Lors de la vérification du code, vous ne pouvez pas faire de hors-séquence. La substance arrive et ensuite vous la corrigez/l'améliorez. Cependant, dans certains systèmes, vous ne recevez pas toutes les informations au moment de l'événement ou dans un ordre linéaire. Pourtant, vous devez toujours calculer la ligne de temps de l'événement du monde réel, même si elle était différente de la ligne de temps que vous avez reçu l'information.

court exemple de la hiérarchie: (chaque objet doit être versionné)

  1. Politique
  2.   Transaction (Date du changement dans le monde réel)
  3.       Couverture (s)
  4.       Emplacement (s)
  5.             Couverture (s)
  6.             véhicule (s)
  7. patata patati

D'un point de vue, si je dois avoir accès à la politique actuelle, je devrait voir tout comme c'est maintenant. Cependant, si j'ai besoin de voir ce qui a été changé dans le cadre d'une transaction il y a 3 semaines, je dois être capable de voir ce que c'était avant ... qu'est-ce qui a exactement changé ... alors qu'est-ce que c'était après le changement. J'ai créé un motif pour essayer de résoudre tout cela tout en essayant de stocker uniquement les informations qui ont changé (ne pas dupliquer la pile entière chaque fois que la version a changé - ce que j'ai vu comme une pratique courante en essayant pour résoudre ce problème). J'ai regardé autour du Web et suis familier avec tous les modèles du GoF et quelques autres. Pourtant, soit je rate le bateau et je deviens trop complexe, soit je ne suis qu'une des rares personnes à faire face à ce genre de situation.

Je posterai le motif que j'ai travaillé dès que possible. D'abord, vos idées & la sagesse. Si vous avez des questions, n'hésitez pas à demander. Merci pour votre temps!

Répondre

0

Il a fini par être 2 stratégies principales pour accomplir ceci avec les compromis principaux étant l'espace ou la complexité. Pour échanger avec de l'espace, vous copiez des piles complètes de données et les versionz. Pour gérer la complexité, vous gérez un système de clé/pointeur léger qui est versionné.

Pour simplifier les choses, nous avons mis en place un système de négociation pour l'espace.

5 clés de base sont nécessaires.L'ID principal, un LinearInstanceID, LinearPreviousID, NonLinearInstanceID et NonLinearPreviousID.

  1. ID = comme vous attendez, un identifiant unique pour le type d'objet
  2. NonLinearInstanceID = la première identification de première instance jamais créé à travers tous les temps
  3. LinearInstanceID = la première identification de première instance sur une ligne de temps spécifique linéaire
  4. NonLinearPreviousID = l'ID de l'objet sur lequel il a pris la place de
  5. LinearPreviousID = Id de la modification directement devant elle (ie. liste liée)

La dernière pièce du puzzle consiste à définir le flux de travail pour décider quand une nouvelle version est requise pour l'ensemble de la pile d'objets attachés. Habituellement, c'est facile puisque vous avez une transaction au niveau de l'entreprise naturelle.

Events

- tous les événements: créer de nouveaux ids primaires uniques

1ère version:

  1. régler la LinearInstanceId & NonLinearInstanceId = ID
  2. laisser
  3. null est à la fois id précédent

nouvelle version (linear normale):

  1. copie les dernières versions des objets
  2. assurez-vous LinearInstanceId & NonLinearInstanceId reste le même que ils étaient à l'ID de la version
  3. point de LinearPreviousId avant d'
  4. NonLinearPreviousId reste null

Nouvelle version (inhabituelle non linéaire):

  1. obtenir tous les objets sur le nouveau calendrier en cours et de les copier
  2. point, le NonLinearPreviousId à l'ID sur la ligne de temps à partir de laquelle ils ont été copiés à partir
  3. mise à jour LinearInstanceId à l'ID de la nouvelle première copie
  4. assurez-vous que NonLinearInstanceId reste le même
  5. insert nouvelle version, chaîne LinearPreviousId régénération des liens (liste chaînée)

Avantages

Je sais que cela semble comme beaucoup de lien, mais voici quelques-uns des avantages:

naviguer facilement à ces zones dans le scénario actuel ou dans tous les délais

  • version originale ou actuelle
  • version Précédent ou Suivant
  • Liste des versions
  • conserver toutes les versions de chaque objet (fonctionne très bien dans un SGBDR traditionnel)
  • peut utiliser des méthodes simples pour détecter les changements entre les versions depuis toutes les versions sont conservées et peuvent facilement naviguer avant/arrière

J'espère que cette aide toute personne qui est dans la même situation. Si vous avez des questions/commentaires, n'hésitez pas à me le faire savoir. Si une aide visuelle pouvait aider, faites le moi savoir.