2009-07-23 8 views
0

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?

Répondre

1

Je voudrais juste avoir un identifiant gagnant (supprimer les identifiants gagnants individuels pour l'équipe et le joueur) et un attribut supplémentaire pour game_type_cd. Ce sera un attribut de recherche qui est une clé étrangère à une nouvelle table appelée GAME_TYPE_COES. Ensuite, tout ce que vous devez faire est de remplir le winner_id et le type de jeu. Cela permettra une quantité infinie de types de jeu avec seulement avoir à ajouter des données à la table GAME_TYPE_CODEs et ne pas avoir à modifier la structure de données.

+0

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

+0

Je pense que votre "hack" serait un bon choix ici pour normaliser la base de données. – northpole

+0

Point bien pris :) J'ai besoin d'apprendre à être moins perfectionniste et à appliquer des solutions spécifiques aux problèmes. – Kai

0

Je pense que cette base de données devrait être relationnelle - Peut-être 1 table pour le (person/team-id), puis un autre qui indique gameid/(team/person-id)/win, puis un autre ID/replayinfo/etcetc

So ..

TeamID | Name 
------------- 
    1 | Thunderbirds 
    2 | John Petravich 

GameID | TeamID | Win? 
----------------------- 
    1 | 1 | 1 
    2 | 2 | 0 

ReplayID | GameID | (Your table's other properties) 
---------------------------------- 
    1 | 1 | etc 

vous pouvez maintenant utiliser la relation pour déterminer toutes les différentes informations sur une équipe ou un individu particulier. Si vous devez personnaliser les pages en fonction de leur nature, ajoutez une colonne de type à la première table et affichez vos pages en fonction de ce type d'identifiant.

$ .02

Questions connexes