JeuWeb - Crée ton jeu par navigateur
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)

Pages : 1 2 3 4


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 Smile

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 Smile

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é Smile

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
SELECT * FROM `bati` b WHERE id not in(select id_bati from bati_user where id_user=1) and id not in(SELECT p.id_bati
FROM prerequis p
WHERE p.niveau_prerequis > ifnull((
SELECT u.niveau
FROM bati_user u
WHERE u.id_user =1
AND u.id_bati = p.id_prerequis ),0))

et pour le tester:
Code :
--
-- Structure de la table `bati`
--

CREATE TABLE IF NOT EXISTS `bati` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  ;

--
-- Contenu de la table `bati`
--

INSERT INTO `bati` (`id`, `nom`) VALUES
(1, 'bati 1'),
(2, 'bati 2'),
(3, 'bati 3'),
(4, 'bati 4'),
(5, 'bati 5'),
(6, 'bati 6');

-- --------------------------------------------------------

--
-- Structure de la table `bati_user`
--

CREATE TABLE IF NOT EXISTS `bati_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_bati` int(11) NOT NULL,
  `id_user` int(11) NOT NULL,
  `niveau` int(11) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci  ;

--
-- Contenu de la table `bati_user`
--

INSERT INTO `bati_user` (`id`, `id_bati`, `id_user`, `niveau`) VALUES
(1, 1, 1, 5),
(2, 4, 1, 2);

-- --------------------------------------------------------

--
-- Structure de la table `prerequis`
--

CREATE TABLE IF NOT EXISTS `prerequis` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_bati` int(11) NOT NULL,
  `id_prerequis` int(11) NOT NULL,
  `niveau_prerequis` int(11) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;

--
-- Contenu de la table `prerequis`
--

INSERT INTO `prerequis` (`id`, `id_bati`, `id_prerequis`, `niveau_prerequis`) VALUES
(1, 2, 1, 1),
(2, 3, 1, 10),
(3, 4, 1, 5),
(4, 5, 1, 1),
(5, 5, 2, 1);

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 Big Grin

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 Big Grin


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...