4

Je commence un projet pour créer une fonctionnalité "objet versioning" pour notre logiciel (.NET 3.5/SQL Server 2008), fondamentalement il doit faire ceci:Je cherche un conseil pour implémenter une fonctionnalité de version dans notre application

  • un utilisateur est à la recherche à un client :
    • nom est "Smith-Johnson"
    • 2 adresses (enregistrés dans différentes tableau)
    • 1 produit acheté
    • 1 employé le contact (enregistré dans différents tableau)
    • 200 mails (enregistrés dans différentes tableau)
  • utilisateur clique sur "Voir le passé" "bouton et choisit" 25 septembre 2009 15:00 "qui apporte une vue séparée qui montre le même client:
    • Nom est "Smith" (le nom a changé depuis) ​​
    • 1 adresse (depuis lors, une adresse a été ajoutée)
    • 1 produit acheté (mais il est différent que ci-dessus puisqu'il l'a acheté, l'a renvoyé plus tard et en a acheté un nouveau)
    • 2 employés contacts (puisque l'un avait été supprimé depuis) ​​
    • 10 mails

En pensant au problème en général un certain nombre de questions se posent:

  • à quel niveau devraient être enregistrés changements, par exemple à la base de données niveau (log chaque changement de chaque propriété de chaque table) ou le niveau d'objet (sérialisation et stocker chaque objet et ses dépendances après après le changement)
  • comment va changements dans la structuredes tables être manipulé, par exemple si la colonne "Nom" devient "Nom", comment suivre les données dans les colonnes comme appartenant à la même colonne (donc le service de version ne signale pas "ce client n'a pas de nom de famille le 25 septembre" mais plutôt sait regarder dans Lastname.
  • ce que technologies de soutien dans le .NET/SQL Server 2008 zone existent qui pourraient soutenir ce, par exemple, je suis à la recherche dans la fonction Change Tracking de SQL Server 2008
  • quel genre de modèles existent pour versioning, par exempleJe pense au Command qui peut être utilisé pour créer une fonction Annuler dans l'application.
  • Ce service de version ne pas besoin d'effectuer des rollbacks. Il doit juste être capable de montrer l'état des objets de leurs dépendances. Quelle est votre expérience dans l'implémentation de fonctionnalités de versioning dans un logiciel?

Quelle a été votre expérience? Quel conseil avez-vous?

+0

Qu'en est-il de l'utilisation d'une structure de base de données sans schéma pour gérer cela? Je pense que vous pourriez probablement enregistrer un index pour les versions précédentes et la structure de la table pourrait être très dynamique de cette façon? Question interessante. – thismat

Répondre

1

Il y a quelques années, je un système d'objets de version afin qu'ils puissent être copiées entre les bases de données dans différents environnements (Dev, Mise en scène, QA, Production)

J'ai utilisé une approche AOP roulées à la main à la temps. Spring.NET ou un autre cadre de l'IoC qui prend en charge AOP serait mieux aujourd'hui. Chaque modification de la propriété d'un objet a été stockée sous la forme d'un changement dans une base de données centralisée. Chaque changement avait un numéro de version. Nous avons utilisé le (s) changement (s) pour enregistrer les actions prises contre des objets dans une base de données et les rejouer dans une cible, copiant efficacement les modifications.

Si vous utilisez un ORM, vous devriez pouvoir changer les noms de colonne dans votre base de données sans vous soucier des noms de propriété si vous utilisez ce type de solution. Si vous modifiez un nom de propriété, les enregistrements de modification peuvent être mis à jour avec le nouveau nom.

Une approche parmi beaucoup d'autres, mais cela a bien fonctionné pour nous et je pense que cela pourrait être un bon début pour votre cas.

2

J'ai travaillé sur un logiciel avec des fonctionnalités similaires à cela. Au lieu de mettre à jour les données dans la base de données, toutes les modifications ont été insérées en tant que nouvel enregistrement au lieu des données mises à jour dans la base de données. Chaque ligne de la base de données a une date de début et une date de fin.

Le dernier enregistrement est celui sans date de fin. À partir de là, vous pouvez interroger l'état des données à n'importe quelle date donnée en recherchant simplement les enregistrements qui étaient actifs à ce moment-là. Les inconvénients les plus évidents sont le stockage, et le fait que vous devez abstraire certains aspects de votre couche de données pour rendre le suivi historique transparent pour tous ceux qui l'appellent.

+0

Je l'ai déjà fait de même auparavant, l'inconvénient est une affaire énorme sur un système qui obtient même une utilisation décente que votre base de données deviendra un monstre dans un court laps de temps. Je serais intéressé de voir comment stackoverflow gère leur versioning. – thismat

+0

@thismat - Vous avez un point. L'application sur laquelle je travaillais était un logiciel de gestion de projet où les données étaient fortement mises à jour quotidiennement. La plus grande base de données de clients que j'ai vu était d'environ 2,3 Go, ce qui n'est pas si grave. Si c'était public, vous pourriez avoir plus d'un problème. –

+0

@Justin Neissner, ce n'est pas aussi mauvais que ce à quoi je m'attendais. Quel temps a-t-il fallu pour grandir? – thismat

Questions connexes