Gestion des prérequis - Version imprimable +- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org) +-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38) +--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51) +--- Sujet : Gestion des prérequis (/showthread.php?tid=5419) |
Gestion des prérequis - Tyc - 12-05-2011 Bonjour, J'avance tranquillement dans mon projet mais je me retrouve face un petit problème. Je n'ai jamais été une flèche dans la modélisation de base de données ni en création de requêtes alambiquées et je dois préparer un système de prérequis pour la construction de mes bâtiments. Par exemple, pour construire une scierie, je doit au préalable avoir un bâtiment principal de niveau 2. Mes relations sont donc basées sur l'existence d'un bâtiment mais également sur le niveau de celui-ci. J'aurais souhaité avoir votre avis sur ma façon de procéder. Voici mes tables Une table bâtiments construits avec id, niveau, id_utilisateur Une table bâtiments requis avec id_batiment_a_construire,id_batiment_requis,niveau_requis La où ça coince c'est lorsque je souhaite afficher tous les bâtiments non construits ET dont la construction est autorisée. A mon sens j'exécute beaucoup trop de requêtes. -1 je récupère tous les bâtiments non construits. -2 Je parcours ceux-ci et pour chaque je récupère leurs prérequis -3 Pour chaque résultat je refais une requête pour vérifier que le bâtiment requis est bien construit et est au bon niveau. donc dans le cas ou je n'ai qu'un bâtiment non construit qui aurait 3 prérequis, cela me fait 5 requêtes pour la vérification ! J'aurais donc voulu savoir si vous voyiez un moyen plus simple de gérer ça Merci d'avance ! RE: Gestion des prérequis - Argorate - 12-05-2011 Moi j'aurais fait une seule grosse requêtes qui récupère tous les bâtiments construit d'un coup plutôt qu'une requêtes pour chaque bâtiment dans ta boucle, ça sera moins couteux en ressource et en temps d'exec. Sinon le principe c'est bien ça... Tu parcourt ta liste de bâtiment, tu vérifies le prérequis, et tu le garde que s'il est remplis. Vaut mieux tout récupérer et travailler en RAM (dans tes variables) que de faire des requêtes dans une boucle, c'est rarement une bonne idée^^ RE: Gestion des prérequis - Ter Rowan - 12-05-2011 ça se fait en une seule requête - bon que je ne suis pas assez confiant pour écrie tel quel, mais ça devrait être un truc du genre - select blabla from bâtiments requis as br, batiments construits as bc WHERE br.id_batiment_requis = bc.id AND br.niveau_requis =< bc.niveau AND bc.id_utilisateur = {l id de l utilisateur) je fais avec ton modèle mais manquerait une table a mon sens : table liste des batiments. En effet certains batiments n'ont pas forcément de prérequis. Et tous on un nom, une image, etc.. RE: Gestion des prérequis - Tyc - 12-05-2011 J'ai effectivement une table qui liste tous les batiments Je me pencherai sur ta requête Ter Rowan et j'essaierai de voir. J'ai du mal à me représenter rien qu'en la lisant ce qui me sera retourné Merci pour vos réponses en tout cas ! RE: Gestion des prérequis - php_addict - 12-05-2011 pourquoi ne pas faire 2 tables une table batiments_liste id | nom | description | id_exigence | niv_exigence | et une table batiments_niveaux id_batiment | niv | prix | RE: Gestion des prérequis - Myrina - 12-05-2011 J'ai également la même problématique mais je pensais la finaliser plus tard. Du coup j'ai fini de m'y plonger. Voici le résultat
et pour le tester: Code : -- Donc, l'utilisateur possède déjà deux bâtiments, le 1 au niveau 5 et le 4 au niveau 2. Les prérequis sont: - pour le 1, pas de prérequis - pour le 2, il faut le 1 au niveau 1 - pour le 3, il faut le 1 au niveau 10 - pour le 4, il faut le 1 au niveau 5 - pour le 5, il faut le 1 au niveau 1 et le 2 au niveau 1 - pour le 6, pas de prérequis Donc les bâtiments constructibles sont le 2 et le 6 RE: Gestion des prérequis - Tyc - 12-05-2011 Que dire si ce n'est : Merci Ta structure de table correspond exactement à la mienne ne plus je n'ai donc pas à la refaire, juste à changer les noms dans ta requête :p Je n’avais pas pensé au deuxième niveau de requête imbriquée ! Merci encore RE: Gestion des prérequis - Asphodèles - 12-05-2011 Il faut encore placer quelques index, non ? RE: Gestion des prérequis - Myrina - 12-05-2011 (12-05-2011, 04:37 PM)Asphodèles a écrit : Il faut encore placer quelques index, non ?oui, il manque aussi les contraintes d'intégrité et certainement d'autres choses encore. C'est juste un exemple fonctionnel pour répondre à la problématique. RE: Gestion des prérequis - php_addict - 13-05-2011 j'ai fais des tests car j'utilise le même principe de base de donnée pour mes bâtiments, et je me permet d'utiliser ce topic pour vous parler de mon expérience sur le sujet le bilan est que c'est lent quand on veut choper toute la liste des bâtiments constructibles par exemple. J'ai de bons index je pense mais l'accès à la base de donnée est lent même sur un dédié...(tables en innodb) du coup je me demande si je ne vais pas garder ce système car c'est facilement maintenable mais faire un système de cache...mais du coup je ne me décide pas comment je vais procéder: - générer une include à partir de données de la base? - memcache ou autre ? voyez vous comment améliorer la vitesse d'éxecution d'une strucutre comme celles citées plus haut? car toute mes pages tournent en moins de 10 ou 15ms mais mes scripts qui utilisent les tables bâtiments tournent entre 40 et 80ms ce qui est assez énorme je trouve... |