2009-07-18 11 views
0

Je travaille sur une application vitrine en PHP avec MySQL. Je stocke actuellement mes données dans 4 tableaux: un pour les lignes de produits, un pour les produits spécifiques dans ces gammes de produits, un pour les images de produits, et un qui spécifie quelles images sont liées à quels produits spécifiques. Chaque produit spécifique appartient à une ligne de produits, chaque image de produit peut appartenir à plusieurs produits spécifiques, et chaque produit spécifique peut avoir plusieurs images. Mes tableaux ressemblent à ceci:Comment stocker des données d'image de produit et de produit pour un magasin en ligne?

ProductLines 
    id, name, description, etc. 
SpecificProducts 
    productLineID 
    id, color, size, etc. 
ProductImageLinks 
    specificProductID 
    imageID 
Images 
    id, imageFileLocation, name, etc. 

Cela fonctionne très bien de cette façon, mais il semble que ce ne soit pas très efficace à des fins de récupération. Par exemple, j'ai une page qui répertorie chaque ligne de produits avec une vignette d'une image choisie au hasard à partir de cette ligne de produits. Pour ce faire, je dois d'abord interroger la base de données pour une liste de toutes les lignes de produits, puis exécuter une requête distincte pour chaque ligne de produits pour obtenir tous les produits spécifiques qui ont des images associées, choisissez l'une d'entre elles, puis interrogez à nouveau pour obtenir l'image. Une autre possibilité que j'ai envisagée serait d'utiliser une requête pour obtenir toutes les lignes de produits que je regarde, une deuxième requête pour obtenir tous les produits spécifiques pour toutes ces lignes de produits, une troisième requête pour obtenir tous les liens d'image qui spécifient quelles images sont liées à quels produits spécifiques, et une quatrième requête pour obtenir toutes ces images. J'imagine que cela serait un peu plus rapide en raison du nombre réduit de requêtes, mais cela laisserait beaucoup de travail à PHP pour déterminer les connexions entre les lignes de produits, les produits et les images, ce qui pourrait être tout aussi lent.

Donc, ma question est, y at-il une meilleure façon de stocker ces données? Ou une meilleure façon de le récupérer en fonction de la base de données que j'ai déjà en place? Ou est l'une des deux options que j'ai identifié vraiment mon meilleur pari?

Editer: Je ne stocke pas les fichiers image dans la base de données. Les fichiers d'image sont stockés dans le système de fichiers. Ma table "Images" dans la base de données stocke simplement l'emplacement du fichier image avec des informations utiles comme le titre de l'image, texte alt, etc

+0

Quand récupérez-vous l'image? Il n'est pas nécessaire d'aller chercher ça tant que le navigateur ne le demande pas - donc l'extraction de l'image ne devrait pas faire partie de la construction de cette page - seul un lien devrait être inséré dans le html – nos

+0

Par "image" . Je ne récupère pas réellement le fichier d'image, juste des données de la base de données qui me disent l'URL du fichier d'image plus des informations utiles comme le texte d'alt. Désolé, ce n'était pas clair. – Robert

Répondre

2

Oui - il suffit d'écrire une seule requête qui récupérera toutes ces informations en un coup .

Je suis un peu rouillé, mais vous pouvez rechercher les requêtes dans mysql reference.

  1. créer une requête qui joint ces tables sur les touches appropriées
  2. vous devez sélectionner le premier élément d'une sous-requête qui récupère les images pour une requête spécifique, puis commande par rand() et sélectionnez la première .

Cela peut certainement être fait dans une seule requête. Même si ce n'est pas possible, vous pouvez toujours créer des vues, ce qui est parfois une meilleure façon d'organiser vos requêtes afin qu'elles soient plus lisibles. En d'autres termes, au lieu de renvoyer le résultat de votre requête, créez simplement une vue correspondant à votre première requête. Créez ensuite une vue qui correspond à l'exécution de votre deuxième requête sur le résultat de la première requête, qui s'exécute hors de la vue. Etc. Ensuite, votre requête peut être effectuée en une seule fois en récupérant la vue finale.

+0

Donc si je vous comprends bien, dans les résultats de ma grande requête, chaque ligne aurait toutes les colonnes nécessaires pour une ligne de produits, un produit spécifique de cette ligne, et une image miniature pour le produit spécifique? – Robert

0

Etes-vous réglé sur le stockage des images dans la base de données mysql?

Dans mon, application similaire, j'ai simplement stocké les images dans /images/productimages/imagesize/productid.jpg où imagesize est "petit", "grand" etc, pour différentes tailles de vignettes, et productid.jpg est l'identifiant de la table SpecificProducts

+0

Je l'ai fait de cette façon dans un projet similaire précédent, mais cette technique est incapable de gérer la relation many-to-many entre des produits et des images spécifiques. – Robert

+0

Juste pour être clair, je ne stocke pas les fichiers image dans la base de données, juste des pointeurs vers les fichiers dans le système de fichiers. – Robert

1

En ce qui concerne la conception de la base de données, vous avez une conception assez solide (et standard). Vous pouvez combiner vos tables ProductImageLinks et Images tant que c'est une relation 1: 1 pour enregistrer certaines requêtes.

En ce qui concerne votre recherche d'images de la gamme de produits, vous avez deux options qui permettraient de réduire considérablement le nombre de requêtes nécessaires:

  1. Créer une nouvelle table dans votre base de données appelée ProductLineImages. Au lieu de choisir l'image de façon aléatoire à partir des produits associés, chargez un ensemble d'images dans ce que vous pouvez choisir au hasard. Ce ne sera pas aussi dynamique de cette façon, mais c'est la méthode la plus efficace.
  2. Vous pouvez faire tout ce que vous avez décrit dans une requête unique (mais moins efficace que # 1).
+0

+1 - La table ProductImageLinks ne semble pas nécessaire –

+0

Ce n'est pas une relation 1: 1. Chaque image peut être liée à plusieurs produits spécifiques, et chaque produit spécifique peut être lié à plusieurs images. Par exemple, une photo peut contenir deux objets ou plusieurs photos du même produit. – Robert

Questions connexes