2009-12-22 5 views
2

J'ai une application rails qui permet de suivre les titulaires de cartes de membre, et a besoin de faire rapport sur l'état d'un titulaire de carte. Le statut est défini - par règle commerciale - comme étant soit «en règle», «en retard» ou «annulé», selon que la facture la plus récente du titulaire a été payée.Recommandations sur la gestion des champs d'état des objets dans les applications rails: magasin contre calculer?

Les factures étant envoyées 30 jours à l'avance, le client qui vient d'être facturé est toujours en règle, celui qui a 20 jours de retard est en retard et un membre qui ne paie plus sa facture plus de 30 jours après l'échéance serait annulée. Je cherche des conseils pour savoir s'il serait préférable de stocker le statut actuel du titulaire de carte en tant que client au niveau du client (et de gérer les anomalies de mise à jour potentielles résultant des mises à jour potentielles des enregistrements de factures sans mettre à jour le dossier), ou s'il est plus logique de calculer simplement l'état actuel du détenteur de carte en fonction des données de la base de données chaque fois que le statut est demandé (ce qui risque de surcharger la base de données et de ralentir l'application).

Recommandations? Ou d'autres idées auxquelles je n'ai pas pensé? Une contrainte importante: bien qu'il soit peu probable que quelqu'un modifie directement la base de données, il y a toujours cette possibilité, je dois donc essayer de mettre en place des mesures de sécurité pour empêcher les différents enregistrements de base de données d'être désynchronisés.

Répondre

2

Le stockage des données calculées dans votre base de données est généralement une optimisation. Je suggère que vous calculiez la valeur sur chaque demande, puis surveillez les performances de votre application. Si le fait que ces données ne soient pas stockées devient un problème pour vous, il est temps de refactoriser et de stocker la valeur dans la base de données.

Le stockage de valeurs calculées, en particulier celles qui peuvent affecter plusieurs tables, est généralement une mauvaise idée pour les raisons que vous avez mentionnées. Lorsque vous refactorisez et stockez la valeur dans la base de données, vous avez probablement besoin d'un travail par lots qui vérifie régulièrement la valeur de l'intégrité des données.

0

L'approche la plus simple consisterait à calculer l'état actuel du titulaire de la carte en fonction des données de la base de données chaque fois que le statut est demandé. De cette façon, vous n'avez aucune duplication de données, et donc pas de problèmes potentiels avec les doublons devenant hors de l'étape.

Si, et seulement si, vos mesures montrent que ce calcul provoque un ralentissement significatif, vous pouvez envisager de mettre en cache la valeur.

0

Récemment j'ai eu une décision similaire à prendre et j'ai décidé de stocker le statut d'un champ dans la base de données. C'est parce que je voulais réduire les requêtes SQL et il semble plus simple. Je choisis de le faire de cette façon car il me faudra très souvent obtenir ce statut et le calculer est (du moins dans mon cas) un peu compliqué.

Le problème éventuel est qu'il est désynchronisé, j'ai donc ajouté quelques after_save et after_destroy au modèle enfant, pour le synchroniser. Et bien sûr, si quelqu'un modifiait la base de données de manière différente, cela poserait quelques problèmes.

Vous pouvez écrire une tâche rake simple qui vérifie tous les états et, si nécessaire, les corrige. Vous pouvez l'exécuter en cron pour ne pas avoir à vous en soucier.