JeuWeb - Crée ton jeu par navigateur
BDD, String vers Hash - 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 : BDD, String vers Hash (/showthread.php?tid=5631)

Pages : 1 2 3 4 5


BDD, String vers Hash - Viciousity - 09-08-2011

Bonjour à tous,

Voila, je stocke dans ma base de donnée des données telles que les abilités de mes joueurs sous la forme : abilities = "2:3:5:7:0".
Ensuite j'ai une fonction qui a pour résultat de faire cela :

a = abilities.split(':')
abilities[:fire] = a[0].to_i
abilities[:earth] = a[1].to_i
abilities[:water] = a[2].to_i
abilities[:air]= a[3].to_i
abilities[:capital] = a[4].to_i

# Ce qui me permet d'accéder a mes données de manière plus facile.
abilities[:fire] => 2
abilities[:capital] => 0

Maintenant je me demande si cette solution est viable ou si je devrais passer a créer un champ pour chaque abilité ability_fire, ability_earth, etc ...


RE: BDD, String vers Hash - Akira777 - 09-08-2011

Perso je pense que c'est une bonne solution, au moins ça te permet de ne pas avoir une table avec trop de champs (si tu en a beaucoup). Après, tu dois faire des classements des joueurs par abilités (classement feu, ...) ça va rajouter des étapes...


RE: BDD, String vers Hash - Sephi-Chan - 09-08-2011

Pourquoi ne pas stocker un hash sérialisé ?


RE: BDD, String vers Hash - Akira777 - 09-08-2011

Hum, pourquoi pas mais...

Je vais donner un exemple tout con, parce que la réponse m'intéresse aussi :

Ma table (fictive) 'joueurs' à les champs suivants 'id', 'password', 'mail', 'login', 'argent', 'village', 'guilde', 'competences'.
Je stocke les infos 'competences' de la manière présenté ici : 150-300-427-1000 pour vie, force, rapidite, fatigue.

Si je veux récupérer la liste décroissante des joueurs qui ont le plus de force, puis-je faire :

"SELECT * FROM joueurs WHERE SUBSTR('competences', 4, 7) ORDER BY SUBSTR('competences', 4, 7) DESC" ?
Sachant que la force peut dépasser 3 caractères, donc mon SUBSTR serait SUBSTR('competences', 4, 8) pour une force de 1500 par exemple.
Du coup, on peut corriger ce problème là en mettant les données de la forme 000150-000300-000427-001000.

Je vois déjà que cette solution est peut-être possible (mise à part cette requête qui est probablement incorrecte) mais sera certainement lourde.

Je pose sûrement mal ma réponse, j'espère que vous comprendrez.


RE: BDD, String vers Hash - Hideaki - 09-08-2011

Je préférais personnellement et professionnellement de stocker dans des colonnes différentes, en de la place gagné en base (ASCII vs int) cela est plus propre et plus compréhensible, si tu ne te souviens pas de l'ordre, plus simple et performant pour trie etc ...

Je te proposerais une troisième solution s'inspirant du second choix, créer une classe ability avec les attributs fire etc, qui est plus correcte niveau de la conception (général & objet).

Concernant le débogage, je ne connais pas ruby, mais abilities[:toto] risque de te donner soit un objet null ou 0, alors qu'avec ability.toto cela ne devrait pas compiler.


RE: BDD, String vers Hash - Viciousity - 09-08-2011

@Sephi : un petit exemple ? Smile

@Hideaki : La table supplémentaire est passées en réflexion mais je procède aussi comme sa pour stocker l'expérience (actuelle, max pour le prochaine niveau, total depuis le début). Bref sa m'arrangerait de stocker sa de manière compacte.


RE: BDD, String vers Hash - Hideaki - 09-08-2011

je n'ai jamais parlé de table supplémentaire mais de colonne ce qui est différent Wink
d'autres part ma proposition
(09-08-2011, 08:10 PM)Hideaki a écrit : Je te proposerais une troisième solution s'inspirant du second choix, créer une classe ability avec les attributs fire etc, qui est plus correcte niveau de la conception (général & objet).

Concernant le débogage, je ne connais pas ruby, mais abilities[:toto] risque de te donner soit un objet null ou 0, alors qu'avec ability.toto cela ne devrait pas compiler.
reste valable sans modifier ta base, le modèle objet et celui de ta base peuvent être différent.




RE: BDD, String vers Hash - Sephi-Chan - 09-08-2011

Je te conseille d'avoir une colonne par attribut. C'est plus lisible, plus efficace et sans inconvénient.

Si malgré tout tu souhaites jouer les bidouilleurs et stocker tes données sous forme d'une chaîne, autant utiliser un format de sérialisation standard tel que JSON ou YAML. Si tu utilises ActiveRecord, tu as même la possibilité d'utiliser serialize en lui spécifiant une colonne de type text et la sérialisation/désérialisation devient transparente.


class Character < ActiveRecord::Base
serialize :abilities
end

user = User.new
user.abilities = { fire: 23, earth: 17 }
user.save

other_user = User.find(42)
other_user.abilities # => { fire: 12, earth: 32 }



RE: BDD, String vers Hash - Akira777 - 09-08-2011

C'est beau tout ça, mais ça ne règle pas le problème...


RE: BDD, String vers Hash - Sephi-Chan - 09-08-2011

(09-08-2011, 10:21 PM)Akira777 a écrit : C'est beau tout ça, mais ça ne règle pas le problème...

Quel problème ?

(09-08-2011, 08:04 PM)Akira777 a écrit : Ma table (fictive) 'joueurs' à les champs suivants 'id', 'password', 'mail', 'login', 'argent', 'village', 'guilde', 'competences'.
Je stocke les infos 'competences' de la manière présenté ici : 150-300-427-1000 pour vie, force, rapidite, fatigue.

Si je veux récupérer la liste décroissante des joueurs qui ont le plus de force, puis-je faire :

"SELECT * FROM joueurs WHERE SUBSTR('competences', 4, 7) ORDER BY SUBSTR('competences', 4, 7) DESC" ?
Sachant que la force peut dépasser 3 caractères, donc mon SUBSTR serait SUBSTR('competences', 4, 8) pour une force de 1500 par exemple.
Du coup, on peut corriger ce problème là en mettant les données de la forme 000150-000300-000427-001000.

C'est une aberration. Si tu as besoin de faire des tris sur ces attributs, il faut passer par une colonne dédiée.