处理来自多个表的结果 - 有更快的方法吗?

时间:2017-10-07 20:38:33

标签: sqlite caching

我只是想改进我的数据库结构,以避免获得克隆结果 我的表位于一个数据库中,看起来像这样:

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
);

这是专为反恐精英服务器设计的插件。它引入了一些额外的功能,例如选择自己的类,接收提供额外功率的设备,调平系统等等。我需要获得存储在那里的几乎所有数据。问题是,每个玩家的装备数量是未知的。因此,我必须弄清楚如何使这些信息尽可能最佳。

目前,我的查询如下所示:

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
(不要害怕那里的一些话 - 我最初来自波兰。需要的东西已被翻译并突出显示)

每次地图更改时,每位玩家都必须接收此数据+整个地图中可能会有一些新数据 如您所见,由于INNER JOIN性质,有一些字段副本。幸运的是,我能够处理结果,因为我知道了类的数量,所以我从[row%number_of_classes]行获取了Equipment,从[row< number_of_classes]行。但是,我觉得它可以做得更好。我正在考虑单独从每个查询中获取结果,但它会使查询数量增加三倍。也许我必须重建整个SQL结构?或者这可能是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

单个查询的输出具有表的形式,即,它具有固定数量的列和特定数量的行。 如果您想通过单个查询获取数据,则别无选择,只能将其排列为表格形式。加入时,这通常会导致重复。

但没有理由使用单个查询。 SQLite没有客户端/服务器通信开销,因此many small queries are just as efficient