JeuWeb - Crée ton jeu par navigateur
Base de donnée en mouvement - 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 : Base de donnée en mouvement (/showthread.php?tid=1872)



Base de donnée en mouvement - Cartoristal - 11-10-2007

Chaque jours je remarque que j'ai mal conçus ma base de donnée.
Un exemple:

Les niveaux de batiments étaient élevés dans la table Joueur ( Scirie = 1, Mine=3 etc ).
Et puis je me suis rendu compte que je ferais mieux de mettre ces niveaux sur une table Parcelle.
Elle fut donc crée.
J'ai donc la table Parcelle avec les batiments dessus, le pseudo du joueur à qui elle appartient....
Marre de changer mes scripts de font en comble pour des petites choses comme cela.
J'ai donc fais ceci:

// CECI VA ËTRE LA BASE DU JEUX WEB //


1) Une base Joueur
2) Une base Armées
3) Une base Attaques_en_cours
4) Une base Parcelles
5) Une base Trésoriers, Mines, Sciries

1) La base Joueur:

Champs:

id : L'id du joueur dans la base ( on pourra les classer ainsi par odre d'inscription du plus ancien au plus jeune
nom : Le nom rentré lors de l'inscription ( par exemple pour dire bojours au joueur
time : Le Timestamp actuel ( sert à rien pour l'instant ( peut donner l'heure ^^ )
Pseudo : Pseudo rentré lors de l'inscription beaucoup utilisé dans les scripts.
Password : Le mot de passe ( vérifier le login, détruire son compte )
terminé : Timestamp de fin de la construction du batiment en cours
batiment_en_construction : Le batiment en construction
metal : Les Kg de Métal du joueur ('on appliquera floor pour avoir un chiffre net )
bois : Stères de bois ( idem pour arrondir )
minerais : Trésors du joueur ( idem )
mine : Niveau de la mine chez le joueur
scirie : Niveau de la scirie chez le joueur
tresorier : Niveau du trésorier chez le joueur
Archers : Nombre d'archers totaux
Cavaliers : Idem pour les cavaliers
Espions : Idem pour les espions
last_connexion : Pour calculer les ressources depuis la dernière co
riz : Ressource en Riz ( nourrir les troupes )
armées_fin : Timestamp de fin de construction des armées
armée_en_construction : Nom des troupes en construction
Parcelles : Nombres de parcelle donc dispose le joueur.
Parcelle_1 : Nom de la parcelle 1 du joueur
Parcelle_X : Nom de la Xème parcelle du joueur

Améliorations: Changer et mettre le niveaux des batiments sur la table de la parcelle !


Une base Armées:

Nom: Nom du soldat ( Archers, Cavliers, Espions, Gardes, Héros )
Attaque: Puissance d'attaque ( de 0 à 150 )
Défense: Puissance de défense ( de 0 à 200 )
Cout_en_riz: Cout en riz par heures
Vitesse: Vitesse du soldat

Une base attaques_en_cours:

Joueur_attaquant: Son pseudo
Joueur_attaqué : Son pseudo
Troupes_attaquantes : les troupes lancées
Parcelle_attaquée : La parcelle visée
Role_Play: Yes Or No ( pour les admins pour fixer les joueur n'ayant pas fais de RP )

Une base Parcelles:

Numéro_Parcelle: Le numéro de la parcelle
Pseudo_occupant: Le pseudo de joueur occupant la parcelle ( ou Seigneur Local )
Terrains parcelle: Le nombre de terrain de la parcelle
Bois: Le nombres de bois de la parcelle
Mines: Le nombres de mines de la parcelle
Carrières: Le nombres de carrières de la parcelle ( les 3 donnerons le nombres de terrains de la parcelle )
Héros_défense: Héros en défense
Cavaliers_défense: Cavaliers en défense
Espions_défense: Espions en défense
Gardes_défense: Gardes en défense

La base Mine, Scirie, Trésorier:

Niveau: Le niveau
Cout_Or: Le prix en fonction du niveau
Cout_bois: Le prix en fonction du niveau
Cout_Metal: Le prix en fonction du niveau
Facteur: Facteur de production ( pour les ressources ).

Je vous demande donc, avec votre habitudes des jeux php^^
Est_ce que vous voyez des choses que je devrais changer ou est ce que je peux élaborer mes scripts à partir ce cela?!
Merci d'avance pour vos précieux conseils.


RE: Base de donnée en mouvement - Zamentur - 11-10-2007

oui moi j'en vois(et je passe vite fais)!

Quand tu fais reference au joueurs, c'est mieux de le faire par son id...
donc dans la table "Armées" tu dois mettre l'id du jouer et non pas son nom

idem pour Parcelles, Attaques_en_cours

De maniere generale il est mieux de faire un identifiant numerique pour chaque chose.

Sinon là il faudrait aussi que tu indique les type associé à chaque champs
de façon à voir ce que tu choisis çà as son importance pour la rapidité du jeu (notament dire ou sont les index)

Citation :time : Le Timestamp actuel ( sert à rien pour l'instant ( peut donner l'heure 34 )
sans avoir verifié je crois que time est un mot clef SQL... Autrement dit il faudra à chaque fois ecrire `time`...
Il vaut mieux changer avec temps
C'est peut etre aussi le cas de Password

Note: dés fois les nom commence par des majuscule désfois pas, faut decider d'une convention çà sera plus simple pour le futur

Il y aussi une repetition des données:
Citation :Parcelles : Nombres de parcelle donc dispose le joueur.
et
Citation :Une base Parcelles:

Numéro_Parcelle: Le numéro de la parcelle
Pseudo_occupant: Le pseudo de joueur occupant la parcelle ( ou Seigneur Local )
Terrains parcelle: Le nombre de terrain de la parcelle
Tu n'as pas besoin du premier pour savoir le nombre de parcelle, la fonction COUNT de sql ou la fonction mysql_num_rows de php peut le faire!

Et le pire de tout selon moi:
Citation :Parcelle_1 : Nom de la parcelle 1 du joueur
Parcelle_X : Nom de la Xème parcelle du joueur
Ce systeme est à proscrire, simplement parce qu'il ya plus simple!

Tu as ta table parcelle:
Citation :Numéro_Parcelle: Le numéro de la parcelle
Pseudo_occupant: Le pseudo de joueur occupant la parcelle ( ou Seigneur Local )
Tu peux donc facilement ajouter une colonne Nom_parcelle

Ainsi si tu veux connaitre le nom d'une parcelle il te suffira de te munir de l'identifiant du joueur et de faire une SELECT dans Parcelle. Et tu pourras meme sortir les caracteristiques de la parcelle!
Et surtout çà t'evite de devoir creer 3 colonnes inutile (et repetitive) dans joueur

Dis le si tu comprend pas exactement pourquoi c'est mieux comme çà


RE: Base de donnée en mouvement - Shiwa - 11-10-2007

Elles sont énormes tes tables ! ^^ 5 tables avec des dizaines de champs, déjà, ça semble douteux.

Il y a un assez bon tuto sur le forum, ici, qui te permettra de savoir si ta base suit un minimum de règles de bonne construction. En pratique on peut être amené à transgresser ces règles pour avoir quelques raccourcis ou de meilleures perfs, mais il vaut mieux construire sa base en les suivant autant que possible.

Je ne crois pas qu'il y ait de tuto qui explique comment construire sa base pour qu'elle soit normalisée dès le départ, j'en ferais peut-être un (c'est ce que j'apprend en ce moment à l'école, autant que ça serve).


Et déjà quelques remarques sur ta base pour appuyer ou compléter celles de Zamentur :
- les parcelle1, parcelle2... parcelle X sont à bannir absolument ! Et si un jour tu décides de faire évoluer ton jeu en faisant sauter la limite au nombre de parcelles ? Et si tu as 5000 joueurs qui n'ont qu'une parcelle, tu va garder 5000*(X-1) valeurs "NULL" dans ta table ?

- "Troupes_attaquantes", qu'est-ce que c'est ? une liste ? Les champs d'une bdd ne peuvent pas contenir de liste. Un id ? de quoi ?

- dans le même genre, pose toi la question "quel type de donnée est-ce ?" Dans une bdd on peut avoir 3 grands types de données : des nombres (entiers ou réels), du texte (plus ou moins long) et des dates (et encore, ce dernier type on pourrait s'en passer).

- ta base évoluera mal, parce que le nom de tes champs, en eux-mêmes, contiennent trop d'information. Transforme "mine, scierie, tresorier" (qui déjà devraient s'appeler plutôt "niveau_mine, niveau_scierie, niveau_tresorier"...) en une table Bâtiments:"id joueur, type_batiment, niveau_batiment". Pareil pour les ressources, la quantité de troupes, etc. Avantage : tu peux ajouter de nouveaux types de bâtiments, ressources, troupes... sans toucher à la structure de ta bdd !

- les noms de tes tables et de tes champs pourraient être plus précis et plus explicites : cf. ma remarque sur "mine, scierie, tresorier" plus haut, mais aussi la table "armées" qui pourrait s'appeler "types d'unités", "joueur attaquant/attaqué" n'est pas très clair sur le type de données enregistré : "id attaquant/attaqué" ou même "id joueur attaquant/attaqué" serait plus propre. Il n'existe malheureusement pas de méthode toute faite pour trouver les bons noms...

- ne stocke pas d'informations que tu peux recalculer (par exemple le COUNT pour le nombre de parcelles), sauf si le calcul ralentit vraiment ta bdd (dans ce cas crée-toi une petite table à part).

- chaque table doit contenir une clé (ou une combinaison de clés). Cette clé est importante, elle te permet de distinguer une entrée de toutes les autres. Indique-la (en la soulignant par exemple). Je ne vois pas quelle est la clé de la table Mine, Scierie, Trésorier.


RE: Base de donnée en mouvement - NicoMSEvent - 12-10-2007

En plus des recommandation de Shiwa, je rajouterais que le fait de tout mettre sur papier (faire une vraie analyse) te permettra de voir ces problème avant même de commencer a coder. Une analyse bien faite te prendra 20% (a peu près) du temps du projet, mais te fera économiser 50% du temps de codage ou tu devras faire les modifs que tu fais actuellement.

On n'insistera jamais assez sur le fait qu'il faut coucher par écrit un maximum...


RE: Base de donnée en mouvement - Kassak - 12-10-2007

Le fait de trier les membres suivant leurs id, a un avantage flagrant que de faire via les pseudos des joueurs?

J'ai toujours utilisé le pseudo du joueur pour faire le lien entre les diverses table..je trouve plus pratique et plus lisible quand on fouille un peu la table.


RE: Base de donnée en mouvement - NicoMSEvent - 12-10-2007

La base de donnée, pour faire des jointures a beaucoup plus de mal a le faire sur des champs texte (meme sur 20 caractères) par rapport a un identifiant (chiffre -> 4 octets)

ça a peut-etre l'air de rien, mais si tu compte ne pas mettre ton serveur sur les genoux rapidement, il faut que tu revois ta manière de procéder. ça peut marcher a tres court terme, mais sur le long terme, c'est pas gérable du tout.


RE: Base de donnée en mouvement - Zamentur - 13-10-2007

Kassak a écrit :Le fait de trier les membres suivant leurs id, a un avantage flagrant que de faire via les pseudos des joueurs?
Pour compléter ce que dis NicoMSEvent:
J'en vois déjà un tout bête... Si un jour tu veux changer le pseudo de quelqu'un tu n'auras pas à faire des requêtes dans toutes tes bases mais dans une seul...
Et puis les nombres c'est plus rapide que les chaines de caractère, donc comme tu feras plein de demande au final çà iras surement plus vite

A la limite les id numériques permettent aussi d'accepter que 2 joueurs ai le même pseudo mais bon c'est assez déconseillé

Donc faut bien se dire que varchar 255 ben c'est 255 octet alors qu'un nombre bien définit (smallint par exemple qui peut aller de -32768 à 32767) te permet déjà d'avoir un nombre considérable de membre sur 2 octet seulement...
Et rien ne t'empêche si un jour tu as besoin de passer en mediumint quand ton jeu sera devenue célèbre (h)
Je crois même que tu peux spécifiè SMALLINT UNSIGNED histoire de pouvoir aller de 1 jusqu'à 65000...

Si tu veux plus d'info sur les type de colonne je te conseille la doc mysql: http://dev.mysql.com/doc/refman/5.0/fr/column-types.html
C'est pas le site du zero mais il y a plein d'info intéressantes

Et si tu n'as jamais entendue parler des jointure http://dev.mysql.com/doc/refman/5.0/fr/join.html (il doit aussi y avoir un tuto qui traine sur le fofo...)

Et le plus important choisis bien tes index j'ai gagné 25% du temps de génération de mes pages en m'apercevant que j'avais oublié de mettre un index dans une de mes tables!

Et si tu veux savoir comment fonctionne ces fameuse clef ou index: http://dev.mysql.com/doc/refman/5.0/fr/mysql-indexes.html

Bonne chances et hésites pas à remettre ce que tu as modifié ici histoire qu'on puisse voir

NB: bon faut pas s'alarmer non plus t'as 5 tables c'est pas énorme donc après c'est pas trop grave non plus...(sur mon jeu il y en a 74) Essaye tout de même de penser à ce que tu pourrais avoir envie de modifier dans ta base par la suite pour ajouter des fonctionnalité et fait en fonction de çà!