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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Optimisation de la BDD

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Optimisation de la BDD

n°2302046
kl14582
Posté le 15-06-2017 à 13:44:37  profilanswer
 

Bonjour,
 
J'ai une question sur comment organiser ma base de données SQL.
 
C'est un petit jeu avec de nombreux niveaux. Les niveaux du jeu sont mélangés d'un joueur à l'autre. Une fois qu'il a résolu un niveau, il passe à un autre (aléatoire).
 
Quelle est la meilleure façon de faire cela ?
 
Lorsque le joueur aura résolu 1500 niveaux parmi 2000, j'ai peur que les requêtes soient très lourdes pour trouver un niveau non résolu.
 
Merci d'avance pour votre aide ;)
 
(pas besoin de me coder le truc, c'est une question purement théorique afin d'optimiser la base et les requêtes)

mood
Publicité
Posté le 15-06-2017 à 13:44:37  profilanswer
 

n°2302048
dede_sav
Posté le 15-06-2017 à 13:58:38  profilanswer
 

Bonjour,
 
Stock les niveaux fini d'un joueur, ça te fera donc une liste puis quand tu fais ta requête tu la fais pour récupérer un niveau aléatoirement parmi les niveaux qui ne sont pas dans la liste :)
 
Si tu veux des conseils plus précis, il faut nous donner plus d'information.

n°2302052
kl14582
Posté le 15-06-2017 à 14:18:34  profilanswer
 

En gros, voilà comment je pensais faire cela :  
 
Table A : ID_niveau, ...
Table B : ID_user, ID_niveau, Date_resolution, ...
 
Chaque niveau résolu génère un enregistrement dans la table B.
 
ET ENSUITE ?
 
Peut-on faire une seule requete SQL  
ou  
Faut-il faire une première requête pour récup les niveaux résolus, déduire en php un niveau non résolu et faire une deuxième requête avec l'ID niveau ?


Message édité par kl14582 le 15-06-2017 à 14:19:12
n°2302054
rufo
Pas me confondre avec Lycos!
Posté le 15-06-2017 à 14:35:46  profilanswer
 

Regardes du côté de Table A LEFT JOIN Table B ON (A.ID_niveau = B.ID_niveau) ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2302101
kl14582
Posté le 16-06-2017 à 13:59:31  profilanswer
 

Merci pour votre aide.
J'avoue que je n'ai jamais utilisé "left join" en SQL et que j'ai du mal à piger le principe même après avoir vu la doc dessus.
 
Mais du coup, le faire en une seule grosse requête est plus rapide/optimisée que d'en faire 2 plus légères ?

n°2302107
rufo
Pas me confondre avec Lycos!
Posté le 16-06-2017 à 15:37:15  profilanswer
 

Ca sera sans doute plus rapide avec une seul requête puisque pas besoin de passer par du code php ou autre. Tout se fait en SQL.
Le LEFT JOIN permet de lister les enregistrements de la table A avec des données se trouvant dans la table B si la jointure spécifiée dans la clause ON () trouve une correspondance. Si pas de correspondance, pour les champs de la table B spécifiés dans le SELECT, on aura la valeur NULL.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2302425
kl14582
Posté le 24-06-2017 à 13:51:45  profilanswer
 

Merci pour ta réponse. Je veux bien un coup de main pour la requête SQL car entre le LEFT JOIN à faire et retourner un seul ID de manière aléatoire, je m'en sors pas.
 
Exemple de BDD
 
Table A : ID_niveau
1
2
3
4
5
-----
Table B : ID_user, ID_niveau_resolu
1, 2
1, 5
-----
 
Quelle serait la requête SQL pour retourner aléatoirement un ID_niveau non résolu pour le user 1 ?
 
Dans l'exemple ci-dessus, l'ID retourné ne peut être que 1, 3 ou 4 (le 2 et le 5 étant déjà résolu)


Message édité par kl14582 le 24-06-2017 à 14:09:58
n°2302427
rufo
Pas me confondre avec Lycos!
Posté le 24-06-2017 à 18:48:53  profilanswer
 

Tu mets rand() dans la clause ORDER BY et un limit 0,1


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2302428
kl14582
Posté le 24-06-2017 à 20:05:33  profilanswer
 

ok mais alors la requête ressemble à quoi avec le left join et le rand ?

n°2302453
rufo
Pas me confondre avec Lycos!
Posté le 25-06-2017 à 22:35:29  profilanswer
 

SELECT A.ID_niveau, B.ID_niveau_resolu FROM A LEFT JOIN B ON (A.ID_niveau = B.ID_niveau_resolu) HAVING B.ID_niveau_resolu IS NULL ORDER BY RAND() LIMIT 0,1


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
mood
Publicité
Posté le 25-06-2017 à 22:35:29  profilanswer
 

n°2302457
kl14582
Posté le 26-06-2017 à 08:05:49  profilanswer
 

Merci Rufo pour ton aide :)


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

  Optimisation de la BDD

 

Sujets relatifs
Optimisation de codeProblème de schéma de BDD
[JQueryUI] Envoi données javascript en BDDMacro trop lente, optimisation du code
Crypter un champ en BDD (mais ce n'est pas une question bdd)optimisation de code
problème liste déroulante avec BDDOptimisation ecriture dans BDD à partir d'un table HTML [résolu]
Conseil d'optimisation BDD vs script ??[MySQL] Système de BDD d'un projet (Conception & Optimisation)
Plus de sujets relatifs à : Optimisation de la BDD


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