1:1关系。分成多个表?坏?

时间:2017-10-03 21:36:38

标签: database postgresql database-design

我正在制作一款手机游戏,乐观地希望我能拥有数百万玩家。

我创建了一个目前大约有8列的用户表(即用户ID,用户名,密码,last_signin等)

对于每个用户,我还需要记录他们拥有的游戏内货币金额(即金,银,宝石等)。

这是1:1的关系(用户只有1个值来定义他们有多少金币。)

我不是数据库专家(这就是我在这里发帖的原因)。我担心如果我在用户表中添加了金,银,宝石等作为新行,那么用户表将以每秒疯狂的查询量进行敲定。每当游戏中有人发现更多黄金,更多白银,登录,创建一个帐户......将访问和/或更新用户表。

将金牌,银币和宝石作为列添加到名为“resources”的新表格中会更加明智,该表格包含以下列:userid,gold,silver,gems。这个新表与用户表具有完全相同的行数,因为用户和资源之间存在1:1的关系。我想知道这些查询是否会更快,因为数据库数据被拆分而且并非所有查询都会转到同一个表。

显然对我来说,将它全部放在1个表中似乎更好,因为它们是1:1 ....但是将大部分游戏数据放在1个表中似乎也是一个坏主意。

感谢您提供任何建议!

赖安

3 个答案:

答案 0 :(得分:2)

在很多情况下,良好的设计要求两个表彼此以1:1的关系。没有规范化规则要求以这种方式分解表。但规范化并不是良好设计的唯一手段。

访问流量是另一个手柄。您对访问资源的直觉比访问基本用户数据听起来更加频繁可靠。但是您需要检查一下,以确保访问资源的交易无论如何都不会使用基本用户数据。这一切都归结为更多的成本:一个胖的用户表或更多的连接。

其他响应者已经暗示,有一天,1:1的关系可能成为1:多关系。我可以想象一个。游戏玩家的模型得到扩展,单个用户可以参与多个不同的游戏实例。在这种情况下,单个用户可能在所有实例中具有相同的基本用户数据,但每个实例中的资源不同。在你的情况下,我无法确定这是否会发生。但是,如果确实如此,那么使用单独的资源表会更好。

答案 1 :(得分:0)

这实际上取决于您的游戏设计,数据库的大小以及未来如何扩展数据库。我会将资源放在一个单独的表中,外键指向用户ID,因为:

  1. 您可以更轻松地保持用户桌更轻薄 维护/备份。
  2. 两者之间简单的1对1 JOIN操作 表格并没有比拥有所有内容更多的资源 同一个表,只要你有正确的索引。
  3. 通过保持桌子分开,你正在实践分离关注; 多个人可以在不必担心的情况下处理不同的事情 关于影响其他表。
  4. 更容易扩展。您可能希望添加其他列,例如birth_date,region,first_name等 与用户更相关'个人信息到用户表中 未来。如果有不同目的的列,那将会令人困惑 存放在一起。 (在PostgreSQL中,你不能简单地安排专栏 虽然您可以为此创建视图。)

答案 2 :(得分:0)

  

这是1:1的关系(用户只有1个值来定义他们有多少金币。)

...现在;)

  

我不是数据库专家(这就是我在这里发帖的原因)。我担心如果我在用户表中添加了金,银,宝石等作为新行

新栏目?

  

将金牌,银牌和宝石作为列添加到名为“resources”的新表中会更聪明吗

可能是因为:

  • 更新频繁更新的部分时,您将执行较小的写入,而不会重写较少修改的用户数据

  • 可以更轻松地审核用户数据的更改