2011-08-25 3 views
4

Prenons un exemple simple: J'ai des produits. Les produits peuvent être dans 1 ou plusieurs catégories, et également dans 1 ou plusieurs canaux. J'ai donc un objet pour le produit, la catégorie et le canal, ainsi que leurs classes de mappeur et d'usine.Comment faire pour réduire le nombre de requêtes MySQL en utilisant le code orienté objet

Mon approche # 1 doit être découplée à 100%; ProductFactory crée simplement une instance d'un produit. Et à l'intérieur de la classe de produit, j'ai la méthode d'instanciation paresseuse qui appelle la catégorie & Channel Factory et stocke l'objet au besoin. C'est très bien pour la page Détails du produit, mais quand il s'agit d'une liste de produits, mon nombre de requêtes est très élevé, car je dois faire 2 requêtes supplémentaires par produit, et je le fais face: quand j'affiche la liste des Dans la catégorie 2, il est complètement fou d'instancier 25 fois la même catégorie pour chaque produit.

Mon approche # 2 consiste à coupler un peu les choses; ProductFactory crée un JOIN et récupère toutes les informations de la catégorie et du canal, et les instancie. IMO c'est aussi désagréable que la première solution, parce que le nombre de requêtes devient faible, je lance juste une requête plus grande, donc en arrière-plan, ça ne change rien.

Mon approche n ° 3 est de garder les choses découplées, mais sans automatisation en chaîne; Je voudrais d'abord boucler tout le produit, et faire un tableau de toute la catégorie et tous les canaux, contrôler l'ID en double, puis instancier tous. Cela semble bien, mais le code n'est plus chaînable. (Je ne peux pas faire $ product-> getCategory() pour obtenir la liste de la catégorie où le produit est stocké.)

Quelle approche suggérez-vous?

+2

Une grande requête n'équivaut pas à plusieurs requêtes plus petites - chaque requête ajoute une surcharge, donc vous êtes mieux si vous pouvez les combiner. –

+0

Vous avez raison, mais je pensais plus au fait que je vais chercher 25 fois la même information ... – FMaz008

Répondre

1

si vous gardez un tableau dans le format

CATEGORY_ID => CATEGORY_OBJECT 

Ensuite, lorsque vous devez assigner une catégorie, vous pouvez vérifier que la première gamme. Par exemple:

$page_categories = array(); 

foreach($products as $product) { 
    if (isset($page_categories[$product->category_id])) { 
     $product->category = $page_categories[$product->category_id]; 
    } 
    else { 
     $product->category = $page_categories[$product->category_id] = new Category($product->category_id); 
    } 
} 
Questions connexes