2010-11-26 27 views
2

j'ai une base de données où j'ai les données dans un certain nombre de tables avec des relations par exempletableaux récapitulatifs MYSQL pour des conseils Web App

TABLE Cars (stock) 
---------------------  
Model colourid Doors 
---------------------- 
xyz  0  2 
xyz  1  4 

TABLE Colour 

Colourid Name 
--------------------- 
0   Red 
1   Green 

je dois produire plusieurs résumés réguliers par exemple un estivaux dans le format.

  | colour    | Num Doors 
Model | red green blue | 2 4 5 6 
---------|----------------------|------------------ 
XYZ  | 1  2  3  | 4 5 3 5 <<< Numbers in stock 

MISE À JOUR - « une voiture peut avoir un arrangement de portes par exemple 2 voitures de porte ou de voitures avec 4 portes Dans le résumé, il indique le nombre de voitures en stock avec chaque configuration de porte pour un exemple de modèle particulier là. 4 voitures de xyz avec 2 portes Veuillez garder à l'esprit que ce n'est qu'un exemple, les voitures peuvent ne pas être le meilleur exemple tout ce que je pourrais trouver à ce moment "

Malheureusement les tables de réarrangement peuvent les rendre meilleures pour les résumés mais pas pour les opérations quotidiennes.

Je peux penser à plusieurs façons de produire des requêtes SQL par exemple/multiples et mettre la table au niveau de la présentation, au niveau SQL UNION avec plusieurs requêtes, VIEWS avec plusieurs requêtes imbriquées ou enfin cron jobs ou code trigger pour produire des données dans un tableau récapitulatif contenant des données adaptées aux requêtes récapitulatives et aux rapports.

Je me demande si quelqu'un pourrait me donner des conseils s'il vous plaît, étant donné que ces méthodes ne sont pas très efficaces, aggravées dans des environnements multi-utilisateurs et où des résumés réguliers peuvent être nécessaires.

+0

Jetez un oeil à un tutoriel JOIN; cela peut être similaire à ce que vous recherchez http://www.w3schools.com/sql/sql_join.asp – Piskvor

+0

Expliquez la relation 'Doors' de votre premier exemple au second? Je suis un peu confus. – Stephen

+0

@ Stephen 4 sûr qu'une voiture peut avoir un arrangement de portes par exemple 2 portes ou voitures avec 4 portes. Dans le résumé, il montre le nombre de voitures en stock avec chaque configuration de porte pour un modèle particulier. S'il vous plaît garder à l'esprit que ce n'est qu'un exemple de voitures peuvent ne pas être le meilleur exemple tout ce que je pourrais trouver. –

Répondre

2

Je pense que vous avez besoin d'une solution d'entreposage de données - fondamentalement, construisez un nouveau schéma à des fins de création de rapports et remplissez ces tables périodiquement.

Il peut y avoir plusieurs mécanismes de mise à jour pour les tableaux de synthèse -

  1. emploi de base prévu de le faire périodiquement. C'est mieux si des informations à jour ne sont pas nécessaires.

  2. Mettez à jour le tableau récapitulatif à l'aide de déclencheurs sur les tables de transactions principales. Cela pourrait devenir un peu compliqué, mais il pourrait être garanti si vous avez besoin d'informations à jour.

  3. Mettez à jour les tables de rapports chaque fois qu'un rapport est dessiné juste avant l'affichage du rapport. Vous pouvez utiliser certaines valeurs d'ancrage pour vous assurer que vous ne recalculez pas trop fréquemment le rapport entier. Il suffit de prendre en compte les nouvelles lignes ou les lignes nouvellement mises à jour après la dernière fois que le rapport a été dessiné.

Le seul problème est que vous devrez modifier la table plusieurs fois chaque fois que de nouvelles valeurs seront ajoutées dans les colonnes pivotées.

+0

Merci je pense qu'une combinaison de 1 et 3 peut être le meilleur itinéraire. si la table n'a pas été mise à jour avant d'afficher la mise à jour du rapport, sinon, si elle n'est pas affichée, mettez-la à jour périodiquement. De toute façon ne pas mettre à jour si le résumé a déjà été mis à jour récemment. –

+2

Oui, cela devrait généralement être l'approche - vous ferez aussi bien si vous travaillez sur votre logique de mise à jour incrémentielle - par exemple. La somme sur la table entière peut être trop lente, vous pourriez donc avoir besoin d'une autre formule, comme existing_sum + sum (new_records_only), pour que cette solution puisse être mise à l'échelle de façon excessive. –

+0

@Ropesh, bon commentaire +1 pour la réponse – Unreason

0

Juste une petite variation de fonction de la taille de la base de données de réponse de Roopesh

, les ressources serveur disponibles, comment vous souvent exécuter ces rapports et surtout si vous ne pouvez pas permettre d'avoir des rapports rassis que vous pourriez faire le plan conceptuel comme ci-dessus, mais pas en utilisant des tables réelles, mais vues

Voici deux liens que vous devriez obtenir commencé

Notes:

  • vous ne devez pas courir de DDL (vous pouvez même sauter CREATE VIEW et utiliser SQL dynamique droite) par rapport à avoir matérialisées résultats
  • la complexité est comparable, mais peu inférieur (ajouter une nouvelle valeur dans le scénario matérialisé nécessite 1) ALTER TABLE ADD COLUMN, 2) INSERT; Avec cette approche, vous ne modifiez que SELECT pour analyser un cas de plus. essentiellement la complexité est identique à l'INSERT)
  • performance peut être bien pire si les utilisateurs regardent les rapports plusieurs fois de la base de données directement, mais comme indiqué précédemment, il garantit également que les données sont frais
+1

Je pensais à la fois modifier la table (dans le dw soln) et modifier pour sélectionner la requête (si nous allons avec la requête pivot) doit être fait par programme. Aucun point selon le développeur pour faire des modifications à chaque fois que les données changent. –

+0

Merci les gars bonnes idées –

+0

@Roopesh Shenoy, yup, a compris. J'essayais juste de montrer une solution plus simple (ce n'est pas aussi évolutif, cependant). – Unreason