Question pour bien optimiser ma bdd (jointures...)

Question pour bien optimiser ma bdd (jointures...) - SQL/NoSQL - Programmation

Marsh Posté le 07-08-2008 à 15:34:24    

Bonjour,
 
Voilà je suis en train de creer ma base de données (mysql) sur phpmyadmin et j'ai une question concernant l'optimisation :
 
Je vais avoir une table "articles" où chaque article pourra avoir plus fichier associés (image, vidéo...)
 
1° solution : je créé une table "fichiers" où je stocke mes fichiers et je créé une table "articles_fichiers" où je mets les correspondances pour chaque article
 
2° solution : je créé un champ fichier dans la table "articles" où je mets les ID des fichiers de la table "fichiers" séparé par des # par exemple
 
3° solution : avez-vous une meilleure idée ?
 
Je rappel que c'est pour gagner en performance...
 
Merci !


Message édité par zazerty le 07-08-2008 à 15:34:49
Reply

Marsh Posté le 07-08-2008 à 15:34:24   

Reply

Marsh Posté le 07-08-2008 à 15:38:11    

variante du 1-  : les fichiers ne devraient pas etre stocké en base, juste le chemin d'accès


---------------

Reply

Marsh Posté le 07-08-2008 à 15:40:01    

bah en fait la table "fichiers" c'est pour faire un gestionnaire de fichiers ou dedans t'as le nom du fichier, son chemin d'accès, son type...
 
Mais même si je stocke que le chemin d'accès, comment j'en mets plusieurs par article ?

Reply

Marsh Posté le 07-08-2008 à 15:45:35    

si un fichier en peut etre rattaché qu'a nu seul articule, tu vas avoir une table qui ressemble a ça :  
 

Code :
  1. idFichier  //autoincrement
  2. idArticle //clé etrangère  
  3. chemin
  4. type


---------------

Reply

Marsh Posté le 07-08-2008 à 15:58:53    

Oui mais justement... Le fichier peut être attaché à plusieurs articles, et chaque article peut avoir plusieurs fichiers

Reply

Marsh Posté le 07-08-2008 à 16:06:42    

Code :
  1. //table fichier
  2. idfichier//autoincrement  
  3. chemin   
  4. type
  5. //table article
  6. idarticle//autoincrement
  7. nom article             
  8. //tableau associatif
  9. idarticle//clé etrangère  
  10. idfichier      //clé etrangère


Message édité par infoman64 le 07-08-2008 à 16:06:56
Reply

Marsh Posté le 07-08-2008 à 16:25:28    

Donc tu me conseilles la solution n°1, j'ai juste un souci pour cette solution :
Vu qu'un article peut avoir 0 ou n fichier, je fais une requete avec un LEFT JOIN... Le problème est que cela me retourne autant de fois l'enregistrement qu'il a de fichier associé.
 
Exemple :
 

Code :
  1. id_article nom_article  id_fichier
  2. 1  test 1
  3. 1  test 2
  4. 2 test2 1
  5. 3 test3 1

Reply

Marsh Posté le 07-08-2008 à 17:48:07    

Si, philosophiquement parlant, ça ne te dérange pas, tu peux associer une image transparente ou blanche aux articles qui n'ont ni image ni vidéo associée.
- Avantage: pas de jointures externes car un article a au moins 1 image
- Inconvénient: considéré comme un "truc et astuce" chez certains développeurs et non comme une solution propre.

Reply

Marsh Posté le 08-08-2008 à 08:50:29    

Euh ouais nan j'suis pas très truc et astuce, d'autant qu'ici ca ne change en rien à mon problème... Merci quand même !

Reply

Marsh Posté le 09-08-2008 à 20:21:06    

et si t'ajoutes un distinct dans ton select ?  [:aelenia]

Reply

Marsh Posté le 09-08-2008 à 20:21:06   

Reply

Marsh Posté le 12-08-2008 à 03:08:51    

soit tu fais en deux passes (un premier select pour ne récupérer que les informations de l'article, puis un second pour ne récupérer que la liste des fichiers attachés à l'article, ce qui évite de faire un left join, et accessoirement rend la détection de l'absence de fichier plus aisée) soit tu ne lis que la première ligne retournée par ta requête en ce qui concerne les infos du fichier, puis tu boucles sur toutes les lignes (y compris la première) pour retrouver les infos des fichiers attachés. a noter que le left join retournera une ligne avec des nulls pour les infos du fichier, et il faudra traîter ça proprement.
 
reste une solution batarde qui existe avec les versions récentes de PHP, une fonction "list" ou un truc comme ça qui permet de retourner sous forme d'une liste séparée par des ";" les informations d'une colonne non contenue dans la clause group by. perso je te déconseille cette méthode, même si elle est tentante, car ça interdit tout portage de ton site vers un autre SGBD. accessoirement, cette fonction doit très bien marcher avec quelques lignes, mais j'aimerais savoir ce que ça donne quand tu récupères 100 chemins d'accès à des fichiers avec... un varchar de quelques milliers de caractères, c'est un coup à avoir une erreur, voir pire, des données incomplètes.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed