Comment savoir quand créer une nouvelle table pour contenir les données qui peuvent être obtenues à partir d'une requête?

8

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?

Rachel
la source
2
Une question clé est «à quelle fréquence les gens souhaitent-ils interroger ces données? S'agit-il d'un rapport ou d'un écran très fréquenté dans l'application?
ConcernedOfTunbridgeWells
@ConcernedOfTunbridgeWells Dans ce cas, il s'agit d'un rapport qui est exécuté plusieurs fois par mois, peut-être plus souvent si nous laissons les agents exécuter le rapport eux-mêmes pour afficher leur commission.
Rachel
Il est probablement préférable de l'intégrer dans un tableau de rapport sur un processus du jour au lendemain, et la commission est «à la date d'hier soir». Si vous avez un processus de fermeture où vous devez fermer puis signaler, vous pouvez fournir une installation dans l'application pour forcer une reconstruction.
ConcernedOfTunbridgeWells
D'après mon expérience, les dates «AsOf» sont assez courantes avec ce type d'opérations dans un contexte financier. Ainsi, un tableau (comme @ConcernedOfTunbridgeWells le note) avec une telle date "AsOf" devrait parfaitement être acceptable.
swasheck
Article connexe: dba.stackexchange.com/q/7592/2660
Nick Chammas

Réponses:

8

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:

  • Fréquence à laquelle les données sont nécessaires
  • Combien coûte cher d'obtenir les données
  • Comment les données doivent être à jour
ConcernedOfTunbridgeWells
la source
1
Donc, fondamentalement, les deux seuls facteurs que vous utilisez pour déterminer si vous avez besoin d'une table permanente pour les données au lieu de les interroger en cas de besoin sont how often the data is neededet how expensive the query is?
Rachel
2
@Rachel - En outre, "à quel point les données doivent-elles être à jour?"
ConcernedOfTunbridgeWells
9

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.

HLGEM
la source
Merci, c'est certainement quelque chose à considérer lorsque vous prenez ce genre de décision. Cette fois, la valeur ne changera pas car le taux de commission est fixé une fois par agent et par client lorsque le client est obtenu, et le taux utilisé est basé sur la date du paiement et la date à laquelle nous avons reçu le client, ni l'une ni l'autre sont des valeurs qui changent.
Rachel
@Rachel - Aucune de ces valeurs ne doit actuellement être modifiée. Bien sûr, si elles font le changement , vous pouvez toujours créer une table de données historiques à ce moment - là, si vous en avez besoin, aussi longtemps que vous ne pas oublier la question.
psr
0

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 ...

Jan Steinman
la source