2011-03-19 4 views
3

En ce qui concerne le stockage de l'historique dans une base de données, est-il préférable d'utiliser une DateEnd (Ex.1) ou une Durée (Ex.2)?Stocker l'historique dans une base de données

Ou n'hésitez pas à suggérer une autre approche qui serait la plus efficace.

Y a-t-il d'autres changements que je devrais apporter à l'un de ces exemples si l'un d'entre eux s'avère être la bonne approche? La base de données utilisée est MySQL bien que je ne pense pas qu'elle ait une incidence sur l'approche ici.

enter image description here

Répondre

1

Il y a deux perspectives sur celui-ci - premièrement, quel est le domaine d'affaires? Dans votre exemple, vous avez utilisé "abonnement" - ils sont souvent vendus comme "mensuels", "hebdomadaires", etc. Toutes choses étant égales par ailleurs, je préfère que ma base de données s'aligne sur les concepts commerciaux lorsque c'est possible. Vous pouvez même aller jusqu'à créer une table "subscription_type" et déduire la durée de la description du type.

Cela se heurte souvent à la nécessité d'exécuter votre base de données. De ce point de vue, je travaillerais sur les requêtes les plus courantes, et je verrais si vous pouvez faire fonctionner la conception de votre base de données avec le minimum de conversion ou de calcul possible. Trouver tous les enregistrements où l'abonnement expire à une date donnée, par exemple, est beaucoup plus facile (et probablement plus rapide) si vous pouvez demander dateEnd < targetDate, plutôt que de calculer la date en ajoutant la durée à la date de début.

+0

maintenant tu me fais réfléchir un peu plus. Je vais devoir regarder dans les choses et voir si la table SubscriptionType pourrait répondre à mes besoins."Cela se heurte souvent au besoin de votre base de données" est-ce en réponse à votre premier paragraphe et donc peut-être que je devrais rester loin de faire cela? L'importance ici est de suivre les dates de fin pour permettre aux utilisateurs de savoir quand ils ont besoin de re-up. Quelque chose comme 30 avis de jour (tout incrément/s) et garder une trace des comptes expirés pour la restriction d'accès. Bien sûr, d'autres cahiers internes seraient faits mais avec le même concept de base en tête. – swisscheese

+0

Oui, le problème de performance est souvent en conflit avec le désir de modéliser le domaine d'activité. Dans votre cas, je ne considérerais pas cela comme un problème majeur à moins que vous n'ayez des millions d'abonnés. Si vous voulez créer des rappels, etc., j'envisagerais de les mettre dans une table de "rappels", avec un statut pour savoir si elles ont été traitées. De cette façon, vous pouvez garder une trace et égaliser les rappels si nécessaire, ou les envoyer les jours où les gens sont plus susceptibles de répondre (week-ends peuvent être pires que les jours de la semaine). –

0

Je stocker la date de fin, par opposition à la durée. Vous pouvez calculer la durée en cas de besoin. Semble avoir plus de sens pour stocker des points de mesure au lieu de mesures.

+0

Si vous utilisez la durée, vous perdez des informations - il est toujours possible de passer des points de mesure aux mesures, mais le plus souvent impossible de recréer les points de mesure à partir de la mesure. –

0

Les valeurs dérivées telles que la durée n'ont pas besoin d'être stockées dans la base de données. Votre approche pour capturer l'historique d'une ligne fonctionnera dans certains cas, mais pour vraiment attraper tous les changements à toutes les lignes, vous aurez probablement besoin d'une autre table, quelque chose comme subscription_hist qui sera mis à jour par un trigger sur insert et update du abonnement. Ensuite, vous devez garder une trace de last_modified_date et last_person_changed_by. Tout le reste pourrait être dérivé. De cette façon, vous pourriez voir ce qui est arrivé à la rangée au fil du temps. Je n'ai pas d'images à clarifier, mais cette méthode, si elle est mise en œuvre avec soin, permettrait une récupération complète des données dans le temps, ainsi que la conservation des informations historiques.

+0

Lorsque vous en introduisez un autre tel que subscription_hist que vous mentionnez, ne créez-vous pas simplement une duplication dans la base de données? Ou suggérez-vous quelque chose comme une table de transaction dans un système financier? – swisscheese

1

Si vous avez une date de début et une date de fin, vous pouvez toujours (ou devriez toujours pouvoir) calculer la durée. Si vous avez une date de début et une durée, vous pouvez toujours (ou devriez toujours pouvoir) calculer la date de fin.

Vous pouvez également enregistrer les trois et appliquer une contrainte de ligne à l'effet qu'ils ne peuvent pas être "incompatibles". Cependant, une utilisation très fréquente de la donnée "date de fin" est de filtrer les lignes "non courantes": quelque chose comme WHERE END_DATE> CURRENTSYSTEMDATE(). Si vous avez ce type d'utilisation, il n'est probablement pas conseillé de "laisser de côté" la date de fin.

Questions connexes