|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 127 ![]() |
Bonjour à tous !
Je suis plutôt débutant en MySQL, je connais à peu près la base disons. Voilà l'idée : j'ai un profil utilisateur, celui-ci peut choisir (mettons) des types de films qu'il aime voir, donc plein de checkbox. Et les autres utilisateurs peuvent faire une recherche selon le type de films (plein de checkbox aussi), et j'aimerais que ma requête me retourne l'utilisateur si au moins une des valeurs correspond. J'avais pensé à ça : - un champ "usr_movies" dans users de type varchar, qui contiendrait par exemple ",3,5,12,18," (les IDs des types de films qu'il aime, encadrés par des virgules), et ensuite dans ma recherche, si l'utilisateur cherche les IDs 2,3,6,12 : Code :
Voila, mais j'ai peur que ce ne soit pas super optimisé. J'ai vraiment du mal à cerner les mots clefs à rechercher sur google, alors si ici quelqu'un a une idée (idéalement : une technique limite obligatoire tellement elle serait efficient), je suis très preneur Merci à vous et bonne journée ! |
||
|
|
00
|
|
|
#2 | ||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 127 ![]() |
En fait à la base j'étais parti sur une utilisation de table de jointure (faite à la main, sans clef étrangère quoi)
Du genre : table movies id = 1, name = "action" id = 2, name = "documentaires" table users_movies um_usr_id um_mov_id Et ensuite dans ma recherche, faire : Code :
Voilà, je m'en remets à vous, quelle est la meilleure solution, ou existe t il une autre solution (j'en suis persuadé Merci à vous |
||
|
|
00
|
|
|
#3 |
|
Expert Confirmé
![]() ![]() |
Les jointures et clé étrangères ne sont pas la même chose.
En effet une jointure permet de lier les donnée a l'extraction de celles-ci de la base de donnée. Les clé étrangères permettre d'avoir plus de contrôle au niveau de la base de donnée. Ce sont ce que l'on appel des contraintes d'intégrité, et comme son nom l'indique ça ne lie pas, çà permet de garantir l'intégrité des données. Je t'invite a lire mon article qui parle de ca : http://alain-defrance.developpez.com/SGBD/constraint/ Pour ton problème que te donne ce code :
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
00
|
|
|
#4 | ||
|
Membre du Club
![]() Inscription : juillet 2006 Messages : 127 ![]() |
En fait je parlais de table de jointure : une table qui associe à un user plusieurs movies. Il me semble que ça s'appelle comme ça ? Et je sais que pour être plus "secure" il faut utiliser des clefs étrangères comme contrainte d'intégrité oui, ce que je ne fais pas (déjà je suis en MyIsam, parait que c'est plus rapide).
En fait je donnais juste un exemple de code, l'echo de ma requete donnerait un truc du genre : Code :
Ce que je fais actuellement c'est ça : table users (usr_id) table users_movies (um_usr_id, um_mov_id) (et en fait les movies sont définis en PHP, pour éviter des requêtes inutiles pour choper les labels) Et ensuite je fais la requête comme expliqué plus haut pour choper tous les utilisateurs qui ont au moins un film dans la liste de ceux recherchés (bon ok j'ai oublié le DISTINCT sûrement Je voulais savoir s'il y avait mieux et plus optimisé que cette méthode ? Merci de ta réponse en tous cas ! |
||
|
|
00
|
|
|
#5 |
|
Expert Confirmé
![]() ![]() |
Autant pour moi je pensais que tu avait un problème dans ta requête.
Je ne trouve pas cette requête sale. En revanche je suis pas particulièrement pour garder les libellés coté Php pour gagner de la performance. Il est vrais que la connexion et une requête a une base de donnée est couteuse. Mais d'un autre coté tu ne sais pas trop comment fonctionne php pour récupérer une valeur a un index donné dans un tableau, du coup tu ne sais pas trop ce qu'il se passe coté serveur quand tu récupère ton indexe. Ce qui est certain en revanche c'est que ton SGBD est fait pour ça, et qu'il le fait donc très bien. Je ne dis pas que php le fait mal, mais seulement qu'il encaissera peut-être pas de la même manière 20 000 occurrences que MySQL.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
00
|
|
|
#6 |
|
Futur Membre du Club
![]() Inscription : novembre 2005 Messages : 34 ![]() |
Moi je ferais 3 tables
tbl_users tbl_type_movies tbl_user_movies (qui rejoint les 2 precedentes) pour rejoindre un peu ce que dit kazou, l'extraction des donnees c'est MySQL, et le traitement c'est PHP, en segmentant tu evites la redondance, et tu allege le code (1 seul select voir 2, et traitement simplissime en php). D'autre part avec ton champ usr_movies en VARCHAR, MYSQL recherche à " l'horizontale" et c'est moins rapide que des colonnes (c'est finalemennt comme un champ de type SET ou ENUM) ++ |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com