Je suis nouveau dans la conception de bases de données et j'ai beaucoup de mal à concevoir une base de données PostgreSQL pour un jeu de combat.Choix des index et des clés primaires pour les performances
Sur ce jeu, les joueurs se battront entre eux, gagnant des ressources pour acheter de meilleures armes et armures. Les combats seront enregistrés pour une révision future et le nombre de combats devrait augmenter rapidement, par exemple, 1k joueurs combattant 1k tours produira 500k records.
L'interactivité du jeu est réduite à dépenser des points pour améliorer l'équipement et les capacités de combat. Les combats sont résolus par la machine.
Détails:
- Un type spécifique d'arme ou armure ne peuvent être Possesed fois par chaque combattant. Les combattants seront presque exclusivement recherchés par
id
. - Je devrai souvent rechercher quels équipements (armes et/ou armures) sont possédés par un combattant spécifique, mais je ne m'attends pas à rechercher quels combattants possèdent un type spécifique d'arme. Les combats seront souvent recherchés par
winner
ouloser
. - Deux données
fighters
peuvent se battre à plusieurs reprises à des dates différentes, de sorte que le tuplewinner
-loser
n'est pas unique sur la tablecombats
- Table
fighters
contient beaucoup de colonnes qui seront récupérées souvent en même temps (je crée deux objets de la classe "Fighter" avec toutes les informations relatives à chaque fois qu'un combat commence)
Ceci est ma conception actuelle:
CREATE TABLE IF NOT EXISTS weapons (
id serial PRIMARY KEY,
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS armors (
id serial PRIMARY KEY,
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS fighters (
id serial PRIMARY KEY,
preferred_weapon INT references weapons(id),
preferred_armor INT references armors(id),
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS combats (
id serial PRIMARY KEY,
winner INT references fighters(id),
loser INT references fighters(id),
*** Game stuff ***
);
CREATE TABLE IF NOT EXISTS fighters_weapons (
fighter INT NOT NULL references fighters(id),
weapon INT NOT NULL references weapons(id),
PRIMARY KEY(fighter, weapon)
);
CREATE TABLE IF NOT EXISTS fighters_armors (
fighter INT NOT NULL references fighters(id),
armor INT NOT NULL references armors(id),
PRIMARY KEY(fighter, armor)
);
Mes questions sont:
- Pensez-vous que mon design est bien adapté?
- J'ai vu beaucoup de bases de données exemple contenant une colonne
id
comme clé primaire sur chaque table. Y a-t-il une raison à cela? Est-ce que je devrais faire cela au lieu des clés primaires de plusieurs colonnes que j'utilise surfighters_weapons
etfighters_armors
? - PostgreSQL crée automatiquement des index pour chaque clé primaire, mais il y a plusieurs tables que je ne pense pas rechercher (par exemple
combats
). Devrais-je supprimer l'index pour la performance? PostgreSQL se plaint d'une contrainte existante. - Comme je recherche
fighters_weapons
etfighters_armors
parfighter
, ainsi quecombats
parwinner
etloser
, pensez-vous que je devrais créer des index pour toutes ces colonnes sur ces tables? - Des conseils pour améliorer la performance? Les opérations les plus utilisées seront: l'insertion et la recherche de combattants, l'interrogation de l'équipement pour un combattant donné et l'insertion de combats.
Merci beaucoup :)
Nitpick mineur: "perdre" est le contraire de "serrer", "perdre" est le contraire de "trouver" (donc votre colonne devrait être appelée "perdant" –
@a_horse_with_no_name C'est vrai .. Merci! –
Techniquement, les «combats» n'ont pas besoin de leur propre clé primaire, ils peuvent utiliser le tuple 'winner' /' loser' comme l'utilisent plusieurs des autres tables d'association.Quel type de jeu est-ce - en temps réel, au tour par tour, etc. Si vous voulez que nous vous donnions plus d'aide, vous aurez besoin de nous donner la disposition complète des différentes tables (en particulier les «combattants»). Hmm .. La plupart des recommandations que j'ai vues ont tendance à dire pour nommer les tables dans le singulier (par exemple «combattant») Vous allez vouloir des indices sur chaque clé primaire, quelle qu'elle soit –