2009-04-14 7 views
0

J'ai un projet impliquant un système de vote par Internet. Les valeurs actuelles et les données associées sont stockées dans plusieurs tables. Les données historiques seront un aspect important de ce projet. J'ai donc créé des tableaux d'audit sur lesquels les données actuelles seront régulièrement transférées. Je trouve cette stratégie très inefficace.Base de données avec contrôle de la version avec utilisation efficace de diff

Même si je n'archive les données que quotidiennement, le nombre de lignes deviendra énorme même si seulement 1 ou 2 utilisateurs font des mises à jour un jour donné.

L'alternative suivante que je peux penser est seulement de stocker les entrées qui ont changé. Cela signifie qu'il faudra construire une logique pour créer automatiquement une vue d'un jour donné. Cela signifie moins de lignes stockées, mais une complexité considérable.

Ma dernière idée est un peu moins conventionnelle. Étant donné que les données historiques serviront à des fins de rapport, les utilisateurs Web n'ont pas besoin d'avoir un accès rapide. Je pense que mon db pourrait ne pas avoir de données historiques. DB ne représente que l'état actuel. Ensuite, tous les jours, le db entier peut être chargé dans des objets (le nombre d'utilisateurs/données est relativement faible), puis sérialisé à quelque chose comme XML ou JSON. Ces fichiers peuvent être différenciés avec le jour précédent et stockés. En fait, SVN pourrait le faire pour moi. Quand je veux les données pour un jour passé, le système doit récupérer la version pour ce jour et la désérialiser en objets. C'est évidemment une opération coûteuse mais la performance n'est pas vraiment un problème ici. J'envisage d'utiliser LINQ pour cela, je pense que cela simplifierait les choses. La procédure de sérialisation devrait être assez organisée pour que le diff fonctionne bien.

Quelle approche adopteriez-vous?

Merci

Répondre

0

Tout ce que vous nous avez dit au sujet de votre système, c'est qu'il implique des votes. Tant que vous stockez des horodatages pour le moment où les votes ont été exprimés, vous devriez être en mesure de générer un rapport décrivant le compte d'état de vote à tout moment ... non? Par exemple, disons que j'ai un système qui compense les caractéristiques préférées (yeux, sourire, bout, ...). Si je veux savoir combien de votes il y a eu pour une caractéristique particulière à une date donnée, alors je recouperais simplement tous les votes pour la fonction avec un timbre de date plus petit ou égal à cette date.

Si vous voulez avoir une histoire d'autres choses, alors vous suivriez une approche similaire.

Je pense que c'est ainsi que cela se passe.

alt text http://i41.tinypic.com/xer5zn.jpg

+0

une chose en cours. Les votes peuvent être supprimés par les utilisateurs ou renvoyés par les administrateurs. Les autres détails sur les éléments sur lesquels les utilisateurs votent changeront également avec le temps. Il y a 4 tables et un total d'environ 20 lignes de données à archiver. –

+0

Ma question a été formulée d'une manière assez générale parce que je trouve que c'est un problème assez général: Quelle est la manière la plus élégante/intelligente de mélanger le contrôle de version et les opérations de ligne. –

0

Avez-vous pensé à utiliser un vrai système de contrôle de version plutôt que d'essayer de caser une base de données à sa place? Moi-même je suis assez partielle à git, mais il y a beaucoup d'options. Ils ont tous un bon support pour les différences entre les versions, et ils ont tendance à être bien optimisés pour ce type de charge de travail.

+0

Donc vous suggérez que je sérialiser/désérialiser et commettre des données à git à la volée? –

+0

Je ne comprends pas vraiment votre énoncé de problème, mais git est conçu avec la performance comme l'un des principaux objectifs de conception - il est susceptible d'être plus rapide que toute autre chose que vous pourriez essayer, si elle correspond bien à votre application –

1

Si vous demandez comment essentiellement des révisions de données sont stockées dans des bases de données relationnelles, je regarderais la façon dont les wikis font.

Les wikis ont pour but de conserver un historique détaillé des révisions. Ils utilisent des bases de données relationnelles simples pour le stockage.

Envisager la base de données de Wikipedia schema.

Questions connexes