|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
Bonjour,
Je travail actuellement sur un site de rencontre et comme tout site de rencontre les utilisateurs peuvent rentrer un nombre important de critères. Mon idée est la suivante sur la structure de la base : Une table utilisateur (là tout est normal (id util, pseudo, idville....) Une table de référence idref (auto incrémenté) nom_ref (exemple de valeurs possibles : yx vert, yx bleu, chv long, fumeur...) type_ref (me permet sous php de savoir quelle information correspond à quoi. Exemple : Pour un utilisateur X pour lequel je souhaite afficher la couleur des yx (imaginons que type_ref = 2 pour les yeux), je vais prendre le nom_ref qui a le type_ref = 2 pour l'utilisateur X) Une table intermédiaire idutil idref Mon but est le suivant : utiliser un index sur un champ INT (en l'occurence idref) sur la table intermédiaire plutôt que de rechercher un champ texte Exemple : si je recherche tous les utilisateurs qui ont les cheveux long je ferai (sachant que l'idref pour les cheveux long est 54) Code :
Mais? si je recherche tous les utilisateurs qui ont les yx bleu ET les cheveux long ET qui fume... Quelle sera ma requête??? ![]() J'aurais voulu faire une requête la plus optimisée possible mais je doute que ce soit le cas actuellement avec cette structure? non? Au secours! Merci par avance pour les retours que vous pourrez m'apporter
|
||
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
bonjour,
il va vous falloir une table avec des metadonnées (vous êtes bien partie niveau modélisation, mais il faut approfondir) Ensuite la requête type pour ce genre de demande est : Code :
Un seul scanage de table (au pire) et vous aurez les personnes qui correspondent à ces critères. |
||
|
|
20
|
|
|
#3 | |
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
Citation:
En tout cas un grand merci pour cette réponse |
|
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
Oui en quelque sorte !
http://sqlpro.developpez.com/cours/m...n/metadonnees/ http://www.developpez.net/forums/d11...s-index-objet/ Votre structure est mal au vu du besoin en fait, regardez trop vite hier soir. Si Cinephil passe par là il aura peut être quelque chose à redire |
|
|
10
|
|
|
#5 |
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
hummm? ok, je vais regarder ça de plus près.
Merci pour les infos.Par contre, pour le moment (après lecture "rapide") je ne vois pas en quoi la structure n'est pas correcte? |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
j'ai oublié un mot dans la précédente phrase : votre structure est pas mal*
|
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
Ok
Encore merci pour la réponse
|
|
|
00
|
|
|
#8 | ||
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
Donc pour retrouver tous les utilisateurs qui sont brun, aux yx bleu et de silhouette normal je peux utiliser cette requête :
Code :
2 étant la couleur des yeux "bleu" 3 étant le type de silhouette "normal" Jusqu'ici tout va bien Par contre, si je souhaite récupérer tous les utilisateurs : qui sont "Brun" (1)La requête si dessus ne plus s'appliquer. De plus, faire des OR tout partout dans la requête risque d'être fastidieux Avez vous une idée?
|
||
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
Bonjour,
Là par contre je crois qu'on ne va pas couper aux sous-requêtes.. Code :
|
||
|
|
20
|
|
|
#10 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Code :
Edit: on n'a pas besoin de la jointure et je n'ai pas trouvé comment barrer alors j'ai mis en gras souligné |
||
|
|
20
|
|
|
#11 |
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
Merci pour la rapidité des réponses
![]() Par contre les deux solutions étant correctes, laquelle des deux est la moins gourmande en ressource (si la base d'utilisateurs est très importante)? Si je comprends bien le code de Jean.Cri1 récupère une liste d'utilisateurs ayant la globalité des caractéristiques demandé (même si l'utilisateur a que les yeux bleu). Puis tri les données avec des sum (case when...)
Et si je comprends bien pour le code de punkoff, je fait un premier tri sur les valeurs 'obligatoires' c'est à dire qu'il y a une seule valeur possible par catégorie (ei : seulement brun pour la couleur des cheveux) Pour finir, une solution possible est de faire un mix entre les deux solutions :
|
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 1 655 ![]() |
Pour les perfs ... il faut que vous analysiez les plans d’exécution des requêtes avec une base chargée.
|
|
|
00
|
|
|
#13 |
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Tu peux aussi faire la requête de punkoff en 'total exists' ce qui devrait éviter le recours au group by ...
Je suis curieux de connaitre les résultats du benchmark, n'hésite pas à nous en faire part. PS: j'ai retouché la requête que j'ai proposée |
|
|
00
|
|
|
#14 |
|
Invité régulier
![]() Inscription : juin 2005 Messages : 39 ![]() |
Merci pour vos réponses, je ne manquerai pas de vous faire part du BENCH
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com