2010-07-17 4 views
0

J'ai une application où je veux prendre un instantané de toutes les entités, en créant des tables clonées qui représentent un moment particulier. Je veux ensuite pouvoir comparer les différences entre ces instantanés pour voir comment les données évoluent au fil du temps.Comment cloner et comparer des tableaux dans NHibernate?

Comment l'accompliriez-vous dans NHibernate? Il semble que NH n'est pas conçu pour ce type de manipulation de données et je ne sais pas si j'abuse de ma base de données, NH, ou les deux.

(post-scriptum En raison de la base de données du moteur restrictions Je ne peux pas utiliser des vues ou procédures stockées.)

Répondre

0

Je finis par augmenter mes entités avec une colonne d'identifiants d'instantanés et de copier les entrées en place dans la table. Combiné avec un filtre, je peux sélectionner à partir de n'importe quel instantané donné. J'ai dû faire quelques correctifs au code existant, mais cela fonctionne essentiellement.

1

Avez-vous vraiment besoin de sauvegarder l'intégralité de chaque entité dans cet instantané? Si c'est le cas, peut-être une collection de tables avec des noms comme type_snapshot aiderait. Vous pouvez enregistrer vos entités dans cette table (insertion uniquement, jamais mise à jour). Vous pouvez stocker l'identifiant de l'élément d'origine et générer un nouvel identifiant pour l'instantané lui-même. Et vous pouvez enregistrer l'horodatage avec chaque instantané. Votre table item_snapshot ressemblerait à quelque chose comme:

id | snapshot_date | item_id | item_prop1 | item_prop2 ... 
123 | 7/16/10 | 15 | "item desc" | "item name" ... 

Au sein de votre domaine, vous pourriez peut-être travailler avec les instances de Snapshot (instantané contenant l'identifiant et la date de l'instantané, avec une instance de T)

Il ne peut pas soyez idéal, car cela introduira un deuxième ensemble de mappings, mais c'est un moyen d'arriver là où vous allez. Il semble que vous feriez mieux de faire quelque chose de plus proche du moteur de base de données, mais sans savoir ce que vous avez en tête pour ces instantanés (du point de vue de l'application) c'est difficile à dire.

0

Nous avons fini par créer des tables en double avec une colonne supplémentaire de type timestamp pour les instantanés. Les index créés sur la table principale étaient plus petits, car nous avions 10 millions de lignes +, donc l'ajout de versions dans la même table créerait beaucoup plus d'enregistrements. Egalement tables de versions dans différents tablespace (fichier db sur mssql)

Questions connexes