Je crée une base de données qui suit les replays d'un jeu. Chaque relecture a un mode de jeu différent qui est soit un gameplay basé sur l'équipe ou un gameplay basé sur l'individu. Selon le mode de jeu, je veux enregistrer l'équipe gagnante ou l'individu gagnant.SQL sachant quand diviser des tables
je la table MySQL suivante qui suit tours dans la reprise et le gagnant associé:
CREATE TABLE replay_rounds (
replay_id INT UNSIGNED NOT NULL,
round SMALLINT UNSIGNED NOT NULL,
winning_player_id INT UNSIGNED,
winning_team_id TINYINT UNSIGNED,
FOREIGN KEY (replay_id) REFERENCES replays(id),
FOREIGN KEY (replay_id, winning_player_id) REFERENCES replay_players(replay_id, player_id),
FOREIGN KEY (winning_team_id) REFERENCES teams(id),
PRIMARY KEY (replay_id, round))
CHARACTER SET=utf8
COLLATE=utf8_general_ci
ENGINE=InnoDB;
En utilisant ce que j'ai maintenant, si le mode de jeu est en équipe alors je tournerai la winning_team_id pour chaque arrondir et définir le winner_player_id à null
. De même, si le mode de jeu est basé sur les individus, je vais définir l'identifiant gagnant_team à null
.
En termes de performances et de bonnes pratiques, est-ce correct de laisser ça comme ça? Y a-t-il une raison impérieuse de diviser cela en un tableau séparé pour chaque mode de jeu (même s'il n'y a que deux modes)? Que diriez-vous d'une situation hypothétique où les modes de jeu sont constamment ajoutés - serait-il mieux résolu en créant une table pour chaque nouveau mode de jeu?
Cela fonctionnerait si le winner_id avait le même type pour chaque mode de jeu. Dans mon exemple, winner_id est un TINYINT si c'est une équipe, et winner_id est un INT s'il s'agit d'un individu. Je pourrais juste choisir INT car c'est un sur-ensemble de TINYINT, mais cela semble être une coïncidence/hack. – Kai
Je pense que votre "hack" serait un bon choix ici pour normaliser la base de données. – northpole
Point bien pris :) J'ai besoin d'apprendre à être moins perfectionniste et à appliquer des solutions spécifiques aux problèmes. – Kai