【问题标题】:smart way to structure my SQLite Database构建我的 SQLite 数据库的聪明方法
【发布时间】:2021-02-25 12:14:44
【问题描述】:

我是数据库方面的新手,对它们只有非常基本的了解。

我需要保存排行榜的历史数据,但我不知道如何以一种好的方式做到这一点。

我会得到一个 accountName、characterName 和 xp 的列表。

到目前为止我在考虑的选项:

  1. 我每 10 分钟将他们的 xp 作为另一个条目添加为每个帐户的额外表格(不确定将角色名称放在该选项中的哪个位置)
  2. 我每 10 分钟向其中添加另一个表的表,其中包含我在该时间间隔内获得的所有数据

我不太确定第一个选项,因为大约有 2000 名玩家我不知道我是否想要拥有 2000 张牌桌(这会有问题吗?)。但我也不觉得第二种选择是个好主意。

【问题讨论】:

  • 发明了数据库,因此您不必将数据存储在 2000 个不同的地方。不要那样做。
  • 数据库的设计接近于口味问题。但是 2000 个具有相同列的表肯定是一个糟糕的设计:将所有内容放在同一个表中,并为玩家 ID 添加一列。您肯定会在该玩家 id 上添加一个索引以加快对玩家的查询,并在需要时为每个玩家创建一个视图。
  • 但是如果我把所有东西都放在一张桌子上,我该如何为每个玩家添加历史数据(每 10 分钟 xp 值)?

标签: python database sqlite


【解决方案1】:

感觉使用一些基本的维度建模技术,您将能够解决这个问题。

具体来说,听起来您需要一个 Player Dimension 和一个 Play Fact 表……可能还需要几个支持表。

很高兴向您介绍维度建模大师 (IMHO):Kimball Group - Dimensional Modeling Techniques

我的建议 - 在那里投入一点时间,在你的工具箱中放一些基本的维度建模工具,这样构建应该会很有趣。

【讨论】:

    【解决方案2】:

    一般来说,您希望拥有少量表,每个表的行数并不重要。这就是优化数据库的情况。从技术上讲,您需要争取实现Third normal form 的结构。

    如果你想知道哪个账户的经验值最高,你会怎么做?如果每个帐户都有一个单独的表,则您必须查询每个表。如果有一个包含所有帐户的表,那么这是一个简单的单个查询。将其扩展为前 15 名同样是一个简单的单个查询。

    如果您有一个每 10 分钟有一次快照的历史记录表,那么随着时间的推移,这会变得相当大,但按照数据库标准来说仍然是合理的。 10 年内每 10 分钟对 2000 个字符进行一次快照将产生 1,051,920,000 行,这可能接近 the maximum number of rows in a sqlite table。但是,如果您达到了这一点,我认为您最好将数据拆分到多个数据库而不是多个表中。您想要轻松访问多远的历史记录?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 2017-03-14
      • 2014-07-05
      相关资源
      最近更新 更多