Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1844 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1770768
zazerty
Posté le 07-08-2008 à 15:34:24  profilanswer
 

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
mood
Publicité
Posté le 07-08-2008 à 15:34:24  profilanswer
 

n°1770776
flo850
moi je
Posté le 07-08-2008 à 15:38:11  profilanswer
 

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


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

n°1770780
zazerty
Posté le 07-08-2008 à 15:40:01  profilanswer
 

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 ?

n°1770788
flo850
moi je
Posté le 07-08-2008 à 15:45:35  profilanswer
 

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


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

n°1770810
zazerty
Posté le 07-08-2008 à 15:58:53  profilanswer
 

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

n°1770821
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 07-08-2008 à 16:06:42  profilanswer
 

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
n°1770832
zazerty
Posté le 07-08-2008 à 16:25:28  profilanswer
 

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

n°1770867
ogaby
Posté le 07-08-2008 à 17:48:07  profilanswer
 

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.

n°1771009
zazerty
Posté le 08-08-2008 à 08:50:29  profilanswer
 

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 !

n°1771599
Scrypt
Posté le 09-08-2008 à 20:21:06  profilanswer
 

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

mood
Publicité
Posté le 09-08-2008 à 20:21:06  profilanswer
 

n°1772257
MagicBuzz
Posté le 12-08-2008 à 03:08:51  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
Question simple de débutant[RESOLU] Question sur la balise <a>
[Delphi 2007] Question de noobQuestion simple sur DELETE, LIMIT et ORDER BY
Question fonction mail()[ORACLE] Question création table
[Oracle] JointuresQuestion Yacc
Question XSD/XML[VB6] Question, "Le grand livre visual basic 6"
Plus de sujets relatifs à : Question pour bien optimiser ma bdd (jointures...)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR