2017-10-07 2 views
0

Je suis juste essayer d'améliorer ma structure de base de données afin d'éviter d'être clonés résultats
Mes tableaux se trouve il une base de données et ressemble à ceci:Traitement des résultats de plusieurs tables - y a-t-il un moyen plus rapide?

CREATE TABLE IF NOT EXISTS `Players`(
    `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    `UserID` INTEGER NOT NULL UNIQUE, 
    `SteamID` TEXT NOT NULL UNIQUE, 
    `Nick` TEXT NOT NULL, 
    `KlanID` INTEGER NOT NULL, 
    `Money` INTEGER NOT NULL, 
    `Kills` INTEGER NOT NULL, 
    `Deaths` INTEGER NOT NULL, 
    `Score` INTEGER NOT NULL, 
    `PayOrNot` INTEGER NOT NULL, 
    `IsNewOne` INTEGER NOT NULL, 
    `HUDMode` INTEGER NOT NULL, 
    `HUDColors` INTEGER NOT NULL, 
    `HUDPoz1` INTEGER NOT NULL, 
    `HUDPoz2` INTEGER NOT NULL 
); 

CREATE TABLE IF NOT EXISTS `Classes` (
    `ClassID` INTEGER NOT NULL PRIMARY KEY UNIQUE, 
    `UserID` INTEGER NOT NULL, 
    `Level` INTEGER NOT NULL, 
    `Health` INTEGER NOT NULL, 
    `Intelligence` INTEGER NOT NULL, 
    `Stamina` INTEGER NOT NULL, 
    `Durability` INTEGER NOT NULL 
); 

CREATE TABLE `Equipment` (
    `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    `UserID` INTEGER NOT NULL, 
    `Name` TEXT NOT NULL, 
    `Type` INTEGER NOT NULL, 
    `Time` INTEGER NOT NULL, 
    `NumberOfUses` INTEGER NOT NULL 
); 

Il est un plug-in conçu pour un serveur Counter Strike. Il introduit certaines fonctionnalités supplémentaires telles que le choix de la classe, l'équipement de réception qui donne des pouvoirs supplémentaires, le système de mise à niveau, etc. Je dois récupérer presque toutes les données stockées. Le problème est, la quantité d'équipement de chaque joueur n'est pas connue. Par conséquent, je dois trouver comment obtenir ces informations aussi optimales que possible.

Pour l'instant, ma requête ressemble à ceci:.

SELECT DISTINCT Players.SteamID,Players.Nick,Players.KlanID,Players.Money,Players.Kills,Players.Deaths,Players.Score,Players.PayOrNot,Players.IsNew,Players.HUDMode,Players.HUDColors,Players.HUDPoz1,Players.HUDPoz2, 
       Classes.Name,Classes.Level,Classes.Health,Classes.Intelligence,Classes.Stamina,Classes.Durability, 
       Equipment.Name,Equipment.Type,Equipment.Time,Equipment.NumberOfUses 
FROM Players 
INNER JOIN Equipment ON Players.UserID = Equipment.UserID 
INNER JOIN Classes ON Equipment.UserID = Classes.UserID 
WHERE Players.UserID=%d 

Here are some sample results
(ne soyez pas effrayés par quelques-uns des mots là-bas - je suis originaire de Pologne Les choses nécessaires Beed a traduit et surligné)

Chaque fois que la carte change, chaque joueur doit recevoir ces données + il peut y en avoir de nouvelles sur la carte.
Comme vous pouvez le voir, il y a quelques copies de champ dues à la nature INNER JOIN. Heureusement, je suis capable de traiter les résultats, parce que je connais le nombre de classes, donc j'obtiens l'équipement des rangées [row% number_of_classes] et des classes des rangées [row < number_of_classes]. Cependant, je pense que cela pourrait être mieux fait. Je pensais obtenir des résultats de chaque requête séparément, mais cela triplerait le nombre de requêtes. Peut-être que je dois reconstruire toute la structure SQL? Ou peut-être que c'est la meilleure façon de le faire?

+1

(1) Votre question est trop compliquée. (2) Votre code ne peut pas être lu. (3) Choisissez la base de données que vous utilisez vraiment. –

+0

Terminé. Les questions en elles-mêmes sont assez simples, je viens d'ajouter quelques explications pour clarifier quelles sont mes intentions – MAGNET

+0

Demander plus que la question serait trop large. (Et personne ne sait à quelle vitesse votre machine est.) –

Répondre

1

La sortie d'une requête unique a la forme d'une table, c'est-à-dire qu'elle a un nombre fixe de colonnes et un certain nombre de lignes. Si vous voulez obtenir vos données avec une seule requête, vous n'avez pas d'autre choix que de l'organiser de façon à ce qu'il y ait une forme tabulaire. Lors de l'adhésion, cela se traduit souvent par des doublons.

Mais il n'y a aucune raison d'utiliser une seule requête. SQLite n'a aucun en-tête de communication client/serveur, donc many small queries are just as efficient.