11-02-2010, 09:50 AM
(Modification du message : 21-02-2010, 11:38 AM par Sephi-Chan.)
Bonjour,
JE m'interroge sur la meilleure structure à adopter pour mes tables, pour un jeu dont les principes de base ressemblent à ogame (l'époque n'est pas la même, le gameplay sera j'espère suffisament différent, mais les structures de base sont les mêmes)
Chaque joueur contrôle un empire constitué de plusieurs villes. Dans chaque ville, il y a un certain nombre d'unités de chaque type, et un certain nombre de bâtiments de chaque type. Ca paraît stupide, et pourtant, j'hésite entre les deux structures suivantes :
Première :
Seconde :
Avantages et inconvénients selon moi :
- Une seule requête, sans jointure, une seule ligne retournée pour savoir combien il y a de bâtiments ou d'unités de chaque type dans une ville donnée dans la première structure. Dans la seconde, il faut trois requêtes et ça me paraît stupide de multiplier les requêtes pour ça alors que j'ai besoin de ces informations presque systématiquement, p.ex. pour mettre à jour les ressources. En plus c'est moins simple de savoir s'il existe un bâtiment d'un type donné dans une ville donnée (ça fait encore une requête inutile de plus)
- Nombreuses requêtes nécessaires pour faire des update dans la deuxième structure : une pour la ville, une pour chaque type de bâtiment et chaque type d'unité mis à jour. Si j'étends la structure aux ressources et aux technologies, le nombre de requêtes par page va juste exploser, et je ne parle même pas encore des batailles...
- Il faut utiliser des variables variables pour accéder aux données dans la première stucture en php, p.ex. $this->{"unite$i"} dans une boucle, ce qui est lent et peu performant. Pas besoin de ce genre de chose dans la seconde, on peut gérer avec des tableaux ou des objets normaux.
- La seconde structure est plus logique, plus facile à comprendre, mieux normalisée, sans doute plus simple à maintenir (ça reste à prouver)
- La seconde permet de pofiter plus facilement de la POO (encore que... pas sûr, j'ai du mal à voir comment exactement)
- Le jour où j'ajoute une nouvelle unité ou un nouveau bâtiment, c'est plus facile avec la première structure (il suffit d'ajouter une colonne, contre autant de lignes qu'il y a de villes pour la deuxième structure)
- S'il existe 10 types de bâtiments, 10 types d'unités, si j'ai 1000 joueurs, que chacun possède en moyenne 10 villes, les tables Batiments et Unites vont être immenses (100000 lignes chacune). Par contre dans la première structure, la table Villes aura un grand nombre de colonnes, genre 30 ou 40.
J'aurais besoin de vos lumières pour trancher (ou pour choisir une troisième solution au cas où vous auriez encore mieux à proposer).....
Merci.
JE m'interroge sur la meilleure structure à adopter pour mes tables, pour un jeu dont les principes de base ressemblent à ogame (l'époque n'est pas la même, le gameplay sera j'espère suffisament différent, mais les structures de base sont les mêmes)
Chaque joueur contrôle un empire constitué de plusieurs villes. Dans chaque ville, il y a un certain nombre d'unités de chaque type, et un certain nombre de bâtiments de chaque type. Ca paraît stupide, et pourtant, j'hésite entre les deux structures suivantes :
Première :
Code :
create table Villes (
id int unsigned auto_increment,
joueur int unsigned not null,
-- ...
batiment0 int unsigned not null,
batiment1 int unsigned not null,
batiment2 int unsigned not null,
-- ...
unite0 int unsigned not null,
unite1 int unsigned not null,
unite2 int unsigned not null,
--- ...
primary key(id));
Seconde :
Code :
create table Villes (
id int unsigned auto_increment,
joueur int unsigned not null,
-- ...
primary key(id));
create table Batiments (
ville int unsigned not null,
type int unsigned not null,
nombre int unsigned not null,
primary key(ville,type));
create table Unites (
ville int unsigned not null,
type int unsigned not null,
nombre int unsigned not null,
primary key(ville,type));
Avantages et inconvénients selon moi :
- Une seule requête, sans jointure, une seule ligne retournée pour savoir combien il y a de bâtiments ou d'unités de chaque type dans une ville donnée dans la première structure. Dans la seconde, il faut trois requêtes et ça me paraît stupide de multiplier les requêtes pour ça alors que j'ai besoin de ces informations presque systématiquement, p.ex. pour mettre à jour les ressources. En plus c'est moins simple de savoir s'il existe un bâtiment d'un type donné dans une ville donnée (ça fait encore une requête inutile de plus)
- Nombreuses requêtes nécessaires pour faire des update dans la deuxième structure : une pour la ville, une pour chaque type de bâtiment et chaque type d'unité mis à jour. Si j'étends la structure aux ressources et aux technologies, le nombre de requêtes par page va juste exploser, et je ne parle même pas encore des batailles...
- Il faut utiliser des variables variables pour accéder aux données dans la première stucture en php, p.ex. $this->{"unite$i"} dans une boucle, ce qui est lent et peu performant. Pas besoin de ce genre de chose dans la seconde, on peut gérer avec des tableaux ou des objets normaux.
- La seconde structure est plus logique, plus facile à comprendre, mieux normalisée, sans doute plus simple à maintenir (ça reste à prouver)
- La seconde permet de pofiter plus facilement de la POO (encore que... pas sûr, j'ai du mal à voir comment exactement)
- Le jour où j'ajoute une nouvelle unité ou un nouveau bâtiment, c'est plus facile avec la première structure (il suffit d'ajouter une colonne, contre autant de lignes qu'il y a de villes pour la deuxième structure)
- S'il existe 10 types de bâtiments, 10 types d'unités, si j'ai 1000 joueurs, que chacun possède en moyenne 10 villes, les tables Batiments et Unites vont être immenses (100000 lignes chacune). Par contre dans la première structure, la table Villes aura un grand nombre de colonnes, genre 30 ou 40.
J'aurais besoin de vos lumières pour trancher (ou pour choisir une troisième solution au cas où vous auriez encore mieux à proposer).....
Merci.
html, javascript, blagues, midi, etc. => http://quentinc.net/