Optimisation de la BDD

Optimisation de la BDD - SQL/NoSQL - Programmation

Marsh Posté le 15-06-2017 à 13:44:37    

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)

Reply

Marsh Posté le 15-06-2017 à 13:44:37   

Reply

Marsh Posté le 15-06-2017 à 13:58:38    

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.

Reply

Marsh Posté le 15-06-2017 à 14:18:34    

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
Reply

Marsh Posté le 15-06-2017 à 14:35:46    

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
Reply

Marsh Posté le 16-06-2017 à 13:59:31    

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 ?

Reply

Marsh Posté le 16-06-2017 à 15:37:15    

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
Reply

Marsh Posté le 24-06-2017 à 13:51:45    

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
Reply

Marsh Posté le 24-06-2017 à 18:48:53    

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
Reply

Marsh Posté le 24-06-2017 à 20:05:33    

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

Reply

Marsh Posté le 25-06-2017 à 22:35:29    

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
Reply

Marsh Posté le 25-06-2017 à 22:35:29   

Reply

Marsh Posté le 26-06-2017 à 08:05:49    

Merci Rufo pour ton aide :)

Reply

Sujets relatifs:

Leave a Replay

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