2009-11-19 4 views
2

Je ne suis pas sûr si ce type de question a déjà été répondu. Dans ma base de données j'ai une table de produit et un tableau de spécifications. Chaque produit peut avoir plusieurs spécifications. Ici, j'ai besoin de stocker les révisions de chaque produit dans la base de données afin de les interroger plus tard à des fins historiques.Stocker des révisions d'objets relationnels de manière efficace

J'ai donc besoin d'un moyen efficace pour stocker les relations des produits aux spécifications chaque fois que les utilisateurs apportent des changements à ces relations. De plus, la quantité de données peut devenir très importante. Par exemple, supposons qu'il y ait 100 000 produits dans la base de données: chaque produit peut avoir 30 spécifications et il y a au moins 20 révisions sur chaque produit. Ainsi, en stockant toutes les données dans un seul tableau, la quantité de données devient énormément élevée.

Des suggestions?

+0

À quelle fréquence vos utilisateurs auront-ils besoin d'interroger les instances historiques d'un produit donné? Si le changement concerne le produit (plutôt que ses spécifications), avez-vous besoin de stocker une révision de * everthing * ou seulement l'enregistrement qui a changé? – APC

+0

Acctuellement, puisque l'utilisateur peut modifier presque tout ce qu'il aime dans le but de changer les données sur un produit, je suppose que je dois conserver des données à la fois pour les détails du produit et aussi les relations aux spécifications. –

Répondre

3

Si cela est purement à des fins 'd'archivage', alors peut-être un tableau séparé pour les révisions est meilleur. Toutefois, si vous devez traiter les révisions précédentes de la même manière que les révisions en cours (par exemple, si vous souhaitez permettre aux utilisateurs de rétablir un produit à une révision précédente), il est préférable de conserver une seule table de produits. plutôt que de copier des données entre les tables. Si vous êtes inquiet au sujet des performances, voici ce que sont les index.

Vous pouvez créer une clé primaire composée pour la table de produits, par ex. PRIMARY KEY (product_id, revision). Peut-être un proc stocké pour trouver la révision actuelle — en sélectionnant la ligne avec le revision le plus élevé pour un product_id — sera utile.

2

Je recommande d'avoir une table, une copie exacte de la table actuelle avec une colonne HistoryDate, et de stocker les révisions dans ce tableau. C'est ce que vous pouvez faire pour les 3 tables en question. En maintenant la révision séparée des tables principales, vous n'encourez aucune pénalité de performance lors de l'interrogation des tables principales.

Vous pouvez également conserver un enregistrement pour indiquer l'utilisateur qui a modifié les données.

Questions connexes