Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 1:1的关系。是否拆分为多个表?糟糕?_Database_Postgresql_Database Design - Fatal编程技术网

Database 1:1的关系。是否拆分为多个表?糟糕?

Database 1:1的关系。是否拆分为多个表?糟糕?,database,postgresql,database-design,Database,Postgresql,Database Design,我正在开发一款手机游戏,我乐观地希望我能拥有数百万玩家 我创建了一个users表,目前大约有8列(即userid、username、password、last_sign等) 对于每个用户,我还需要记录他们在游戏中拥有的货币数量(如黄金、白银、宝石等) 这是一种1:1的关系(用户只有1个值来定义他们拥有多少黄金) 我不是数据库专家(这就是我在这里发帖的原因)。我担心,如果我在users表中添加gold、silver、gems等作为新行,那么users表每秒将被大量的查询所困扰。每次游戏中有人发现更

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

我创建了一个users表,目前大约有8列(即userid、username、password、last_sign等)

对于每个用户,我还需要记录他们在游戏中拥有的货币数量(如黄金、白银、宝石等)

这是一种1:1的关系(用户只有1个值来定义他们拥有多少黄金)

我不是数据库专家(这就是我在这里发帖的原因)。我担心,如果我在users表中添加gold、silver、gems等作为新行,那么users表每秒将被大量的查询所困扰。每次游戏中有人发现更多的金子,更多的银子,登录,创建一个帐户。。。将访问和/或更新用户表

在一个名为“资源”的新表中添加gold、silver和gems作为列会更明智吗?该表包含以下列:userid、gold、silver和gems。这个新表的行数将与用户表的行数完全相同,因为用户和资源之间存在1:1的关系。我想知道这些查询是否会更快,因为数据库数据是分开的,并且不是所有查询都会进入同一个表

显然,对我来说,这似乎是更好的把它放在一个表中,因为他们是1:1。。。。但将大部分奥运会数据放在一张表中似乎也是个坏主意

谢谢你给我的建议


Ryan

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

  • 您可以使用户表更纤细,以便 维护/备份
  • 两个节点之间的简单1对1连接操作 表并不比把所有的东西都放进去占用更多的资源 相同的表,只要有适当的索引
  • 通过将你的桌子分开,你正在练习将关注点分开; 多人可以处理不同的事情而不必担心 关于影响其他表
  • 更容易扩展。您可能需要添加其他列,如出生日期、地区、名字等 与用户的个人信息更相关,请参见中的“用户”表 未来。如果使用不同用途的列,则会造成混淆 储存在一起。(在PostgreSQL中,您不能简单地排列列 尽管您可以为此创建视图,但仍需订购。)
  • 这是一种1:1的关系(用户只有1个值来定义他们拥有多少黄金)

    。。。现在;)

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

    新专栏

    将黄金、白银和宝石作为列添加到名为“资源”的新表中是否更明智

    可能是因为:

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

    • 它使审核用户数据的更改变得更容易


    在很多情况下,好的设计要求两个表以1:1的比例相互关联。没有规范化规则要求以这种方式分解表。但是规范化并不是好设计的唯一方法

    访问流量是另一个句柄。你的直觉是,访问资源的频率将远高于访问基本用户数据的频率,这听起来是可信的。但您需要检查它,以确保访问资源的事务最终不会使用基本的用户数据。归根结底,成本更高的是:胖用户表还是更多连接

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