06-11-2018, 12:55 PM
Salut,
j'ai une question d'ordre "préférence personnelle", mais je serai curieux d'avoir quelques points de vue dessus.
Dans VariiSpace, les joueurs peuvent concevoir leurs vaisseaux. Chaque plan de vaisseau aura donc des "propriétés" (sommairement, on va simplifier avec des PV, une masse, une vitesse max, et une puissance de feu).
Ces propriétés sont calculées par une méthode (une fonction SQL, mais osef un peu du code là).
Ma question porte sur la manière de stocker cette information: est-ce que vous la stockeriez dans une table dédiée (disons, "spaceship_blueprint_properties") ou est-ce que vous laissez le système recalculer les propriétés du vaisseau à la volée quand vous en avez besoin?
Le 2nd cas me semble plus "naturel": on a un vaisseau avec une géométrie, des modules, des recherches du joueurs, etc, et on calcul donc les propriétés de combat/vitesse/PV de ce vaisseau à partir de ces infos entrantes.
Mais
1) Ce calcul peut être lent (bon, ça, osef un peu, c'est pas un argument)
2) Le calcul peut changer au cours de la vie du jeu, et les propriétés des vaisseaux changeront donc immédiatement: un joueur qui n'a rien fait verra son vaisseau changer de propriétés, sans forcément le voir
3) On ne peut pas afficher les propriétés des vaisseaux. Enfin, si, on peu, mais comme c'est calculé à la volée, ces propriétés pourraient différer entre le moment où on les affiche à l'écran, et le moment où un combat a lieu
Le 1er cas semble alors plutôt bien adapté, puisqu'on "fige" finalement les propriétés à un instant donné (en les recalculant quand c'est utile) et on n'a donc plus de soucis de lenteur, ou de changement de propriétés "à la volée" sans que le joueur ne le sache. Le cas 3 peut éventuellement arriver, mais uniquement si le joueur a fait une action au milieu (aka si les propriétés ont été recalculées). Donc, ce n'est pas dérangeant.
En revanche, cela fait un peu... "dénormalisation" du modèle je trouve (comme si je stockait la date de naissance du joueur, et que je stockais aussi son age, recalculé chaque jour, dans une colonne). Mais je ne sais pas trop si c'est un vrai argument...
J'ai une troisième piste intermédiaire à la limite: "stocker" les propriétés dans une vue. Cela me supprime le soucis de dénormalisation, mais cela réactive les problèmes 2 et 3 (le 1, on peut l'ignorer si la vue est matérialisée, même si MySQL ne sait pas le faire)
Bref, votre opinion là dessus? Votre expérience?
Perso, je vais le faire de la 1ere façon, parce que la "normalisation" à outrance, je m'en tappe un peu (il suffit de savoir que cette table est "calculée" à partir d'autres infos, ce qu'un commentaire indique facilement).
j'ai une question d'ordre "préférence personnelle", mais je serai curieux d'avoir quelques points de vue dessus.
Dans VariiSpace, les joueurs peuvent concevoir leurs vaisseaux. Chaque plan de vaisseau aura donc des "propriétés" (sommairement, on va simplifier avec des PV, une masse, une vitesse max, et une puissance de feu).
Ces propriétés sont calculées par une méthode (une fonction SQL, mais osef un peu du code là).
Ma question porte sur la manière de stocker cette information: est-ce que vous la stockeriez dans une table dédiée (disons, "spaceship_blueprint_properties") ou est-ce que vous laissez le système recalculer les propriétés du vaisseau à la volée quand vous en avez besoin?
Le 2nd cas me semble plus "naturel": on a un vaisseau avec une géométrie, des modules, des recherches du joueurs, etc, et on calcul donc les propriétés de combat/vitesse/PV de ce vaisseau à partir de ces infos entrantes.
Mais
1) Ce calcul peut être lent (bon, ça, osef un peu, c'est pas un argument)
2) Le calcul peut changer au cours de la vie du jeu, et les propriétés des vaisseaux changeront donc immédiatement: un joueur qui n'a rien fait verra son vaisseau changer de propriétés, sans forcément le voir
3) On ne peut pas afficher les propriétés des vaisseaux. Enfin, si, on peu, mais comme c'est calculé à la volée, ces propriétés pourraient différer entre le moment où on les affiche à l'écran, et le moment où un combat a lieu
Le 1er cas semble alors plutôt bien adapté, puisqu'on "fige" finalement les propriétés à un instant donné (en les recalculant quand c'est utile) et on n'a donc plus de soucis de lenteur, ou de changement de propriétés "à la volée" sans que le joueur ne le sache. Le cas 3 peut éventuellement arriver, mais uniquement si le joueur a fait une action au milieu (aka si les propriétés ont été recalculées). Donc, ce n'est pas dérangeant.
En revanche, cela fait un peu... "dénormalisation" du modèle je trouve (comme si je stockait la date de naissance du joueur, et que je stockais aussi son age, recalculé chaque jour, dans une colonne). Mais je ne sais pas trop si c'est un vrai argument...
J'ai une troisième piste intermédiaire à la limite: "stocker" les propriétés dans une vue. Cela me supprime le soucis de dénormalisation, mais cela réactive les problèmes 2 et 3 (le 1, on peut l'ignorer si la vue est matérialisée, même si MySQL ne sait pas le faire)
Bref, votre opinion là dessus? Votre expérience?
Perso, je vais le faire de la 1ere façon, parce que la "normalisation" à outrance, je m'en tappe un peu (il suffit de savoir que cette table est "calculée" à partir d'autres infos, ce qu'un commentaire indique facilement).