2010-09-24 4 views
2

Je voudrais savoir s'il est possible de simplifier le processus suivant: Je veux marquer un jeu pour l'expédition à un client basé sur les critères suivants: (Si vous êtes familier avec Netflix, c'est l'équivalent de leur file d'attente de films.)J'ai besoin de conseils sur la façon de simplifier/améliorer un modèle de commande dans mysql

  1. Combien de jeux ils ont à la maison.
  2. Combien de jeux ont-ils reçus au total pour leur mois de facturation?

J'ai une table qui stocke les choix des clients (leur file d'attente de jeux) appelés listes de souhaits. J'utilise la requête suivante pour classer automatiquement leurs choix pour les enregistrements nouvellement insérés (rang détermine la priorité d'expédition):

schema (id, memberId, gameId, rank, markedForShipment, shippedOn, returnedOn) 

     INSERT INTO wishlists (memberId, gameId, rank, markedForShipment) 
     SELECT @memberId, @gameId, COALESCE(MAX(rank), 0) + 1, 0, null, null 
     FROM wishlists 
     WHERE wishlists.memberId = @memberId 

Je voudrais remplir automatiquement « markedForShipment » avec un 0 ou un 1 sur la base deux critères: 1. How many games a member has already received this month et 2. how many games a member currently has at home

en ce moment je fais ce qui suit après chaque insertion:

  1. Grab les limites du plan d'une table de plans (shipmentsPerMonthLimit et gamesAtHomeLimit).

  2. Découvrez combien d'expéditions (shipmentCount) un membre a eu ce mois-ci

    SELECT COUNT(shippedOn) AS shipmentCount 
        FROM wishlists 
        INNER JOIN members ON wishlists.memberId = members.id 
        WHERE wishlists.memberId = @memberId 
        AND wishlists.shippedOn >= members.billingCycleStart 
        AND wishlists.shippedOn < DATE_ADD(members.billingCycleStart, INTERVAL 1 MONTH) 
    
  3. Découvrez combien gamesAtHome un membre a

    SELECT COUNT(shippedOn) AS gamesAtHome 
        FROM wishlists 
        WHERE memberId = @memberId AND shippedOn IS NOT NULL AND returnedOn IS NULL 
    
  4. Découvrez combien de livraisons en attente (markedForShippment) un membre a

    SELECT COUNT(markedForShippment) AS queuedShipments 
        FROM wishlists 
        WHERE memberId = @memberId AND markedForShipping = 1 
    
  5. Vérifiez pour voir si le jeu est en stock.

Si tout ce qui suit est vrai que je mets à jour l'enregistrement nouvellement inséré par la mise markedForShipping to 1.

gamesAtHome is < than gamesAtHomeLimit 
shipmentCount is < than shipmentsPerMonthLimit 
queuedShipments is < gamesAtHomeLimit 

Comment puis-je améliorer ce processus? Puis-je le simplifier? Je pose ces questions en gardant à l'esprit que la performance est probablement le facteur le plus important. 4.

Répondre

1

Cela me semble assez efficace (je suppose que vous utilisez des index et des clés étrangères). Mon conseil serait de ne pas optimiser, sauf si vous avez vraiment des problèmes de performance.

La seule façon dont je vois pour optimiser cela serait d'introduire la redondance. Par exemple, vous pouvez ajouter "shippingLimitReached" et "gamesAtHomeLimitReached" à la table des membres. Si de nombreux utilisateurs atteignent leurs limites (et probablement des utilisateurs avec une longue liste de souhaits), vous pouvez enregistrer des SELECTs.

+1

Je suis d'accord avec cette réponse. À moins que vous n'ayez des problèmes particuliers à poser, il est difficile de faire des commentaires. Vous pouvez bien sûr fusionner quelques-unes de ces requêtes, mais que vous en tiriez beaucoup ou pas, cela dépend un peu de la manière dont vous lancez les requêtes et ainsi de suite ... – andy

+0

Merci les gars!Ma seule préoccupation est que les gens vont ajouter des choses à leurs listes tout le temps, donc il semble que beaucoup de requêtes se passe à chaque fois que quelqu'un ajoute quelque chose à leur liste ... Andy, comment consolideriez-vous certaines de ces requêtes? – Mohamad

+0

Toutes les idées que j'avais pour fusionner n'ont pas fonctionné. Vous pouvez tout faire dans une procédure stockée, cela réduira la communication avec la couche de base de données. – Cephalopod

Questions connexes