2009-09-21 10 views
4

Je commence à utiliser SQLAlchemy pour un nouveau projet où je comptais mettre en œuvre une piste de vérification semblable à celui proposé sur ce quiestions: Permettre à l'utilisateur de rollback de piste d'audit db avec SQLAlchemy

Comme je serai déjà toute l'histoire des objets « intéressants », je pensais à permettre aux utilisateurs de revenir à une version donnée, en leur donnant la possibilité d'avoir undo illimité.

Est-ce que cela peut être fait de manière propre avec SQLAlchemy?

Quelle serait la correcte façon d'exposer cette fonctionnalité dans l'API interne (logique métier et ORM)?

J'étais quelque chose le long des chemins de user.rollback(ver=42).

Répondre

7

Bien que je ne l'ai pas utilisé SQLAlchemy spécifiquement, je peux vous donner quelques conseils généraux qui peuvent être facilement mises en œuvre dans tous les ORM:

  • séparer l'élément versionné en deux tables, dites Document et DocumentVersion. Document stocke les informations qui ne changeront jamais entre les versions, et DocumentVersion stocke les informations qui changent.
  • Donnez à chaque DocumentVersion une référence "parente". Faites une clé étrangère à la même table, en pointant vers la version précédente du document.
  • Revenez aux versions précédentes en mettant à jour une référence de Document à la version "actuelle". Ne supprimez pas les versions en bas de la chaîne.
  • Quand ils font des versions plus récentes après l'annulation, il va créer une autre branche de versions.

exemple, créez A, B, C, B rollback, créez D, E:

(A) 
| 
(B) 
| \ 
(C) (D) 
    | 
    (E) 
+0

L'permettant de ramification est cool, mais ça ne serait pas vraiment vraiment difficile de faire la fusion vers le bas la route? – voyager

+1

Ce n'est pas comme le contrôle de source. Du point de vue de l'utilisateur, vous avez totalement supprimé C. Vous n'aurez jamais besoin de le fusionner. La seule raison pour laquelle il est toujours présent est une piste d'audit, ou au cas où vous auriez besoin d'extraire manuellement un élément supprimé pour une raison quelconque. –