Nous avons une table de paiement et les agents reçoivent une commission sur les paiements. La commission est basée sur quelques facteurs différents, tels que le temps qu'il a fallu pour obtenir le paiement, il y a donc des calculs impliqués lors de la détermination du taux de commission que l'agent obtient, mais rien d'obscurément complexe.
Par exemple, ce ne sera probablement jamais plus complexe que cela:
SELECT Payments.Amount * CASE
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
ELSE Rates.Rate3 END
Serait-il judicieux de créer une deuxième table pour conserver ces données au lieu de les interroger chaque fois que cela est nécessaire? Ou devrais-je simplement m'en tenir aux requêtes d'exécution qui extraient les données chaque fois qu'elles sont demandées?
Et plus important encore, quels sont les facteurs à utiliser pour déterminer si une requête doit être exécutée chaque fois que les données sont nécessaires, ou si les données doivent être stockées dans une table distincte qui lui est propre?
Réponses:
Si la requête est exécutée assez rarement (par exemple un rapport), il est probablement préférable de créer la table à la volée 1 . Si la requête est exécutée fréquemment et que la table temporaire est requise pour les performances, vous pouvez potentiellement rencontrer un problème.
Si la table est bon marché à construire, faites-la comme une table temporaire. Tant que la base de données est suffisamment rapide, vous pouvez vous en tirer. Cependant, vous devrez surveiller les performances.
Si le tableau ne doit pas être totalement à jour mais fera l'objet d'activités de reporting relativement fréquentes, une reconstruction périodique est probablement la meilleure solution.
Si la table est coûteuse à construire mais doit être à jour, vous devrez peut-être la gérer comme une structure dénormalisée, soit maintenue comme une vue indexée, soit via des déclencheurs. C'est un peu plus compliqué et impose une charge supplémentaire sur les opérations d'écriture.
Dans des cas plus extrêmes (c.-à-d. Des volumes de données importants), vous pouvez avoir besoin d'une approche hybride dans laquelle les données historiques sont interrogées à partir d'une structure dénormalisée optimisée pour les performances et les données actuelles sont interrogées à partir de l'application en direct.
Les cas les plus extrêmes peuvent vous permettre d'accéder à des flux de stockage de données à faible latence et à des solutions OLAP hybrides.C'est donc de loin le plus complexe en termes de profondeur du trou du lapin. Il vaut mieux éviter, sauf si vous avez une véritable exigence.
Dans le cas où vous décrivez ci-dessus, une reconstruction périodique d'un tableau de rapport semble appropriée. Si vous devez fermer au milieu d'une journée pour exécuter des rapports, vous pouvez fournir une fonction pour forcer une mise à jour à partir de l'application. Sinon, exécutez-le sur un processus de nuit et les agents peuvent voir leur commission «à minuit le jour ouvrable précédent».
1 Les
select into
requêtes créant des tables temporaires sont assez rapides sur SQL Server car les opérations d'insertion sont enregistrées de manière minimale.Donc, pour résumer, vous utilisez les facteurs suivants pour déterminer si vous devez ou non avoir une nouvelle table pour vos données:
la source
how often the data is needed
ethow expensive the query is
?Un problème non couvert dans la réponse acceptée est "avez-vous besoin de cette valeur au fil du temps" et "la formule changera-t-elle éventuellement".
Par exemple, considérons l'exemple de commision. Si la commission est payée, le montant doit être stocké car il s'agit d'une figure historique de ce qui a été réellement payé. La façon de calculer les commissions pourrait changer le mois prochain (et le fait souvent), mais cela ne changera pas ce qui a été réellement payé et qui doit être stocké séparément.
C'est la même idée que de stocker le prix que le client a réellement payé pour un produit (après un calcul des remises, etc.) plutôt que de s'appuyer sur une formule par rapport à un tableau de prix pour faire autre chose que le calcul initial car le prix du produit le mois prochain pourrait ne pas être le même que le prix au moment où le client a passé la commande.
Si vous avez besoin d'un enregistrement historique de la valeur à un moment donné, stockez toujours cette valeur après avoir utilisé la formule de calcul initial.
la source
Probablement pas d'intérêt si vous êtes enfermé dans une base de données particulière, mais MariaDB (MySQL-based work-alike) a quelque chose de merveilleux appelé "colonnes virtuelles" qui peuvent être calculées à la volée ou mises en cache dans le stockage réel, mais de manière automatique. recalculé au besoin. J'ai raté cette fonctionnalité depuis que j'ai quitté FileMaker Pro pour le monde SQL il y a de nombreuses années ...
la source