2016-12-28 131 views
1

我对NoSQL和DynamoDB非常陌生,我习惯于RDBMS。我正在为游戏设计数据库,并且我们正在使用DynamoDB和AWS Lambda作为后端。我为包含用户信息和资源的播放器配置文件创建了一个表名“用户”。由于游戏具有库存系统,我还创建了一个表名“UserItems”。DynamoDb表设计:单表或多表

直到我意识到DynamoDB没有事务,并且在两个表上执行的任何操作(例如,使用增加资源的项)在一个表上有成功失败的可能性时,缺少影响我们客户的数据。

所以我在想也许我的多表设计并不好,因为我在使用RDBMS时设计多个表是一种习惯。这让我想到在“用户”中存储整个“UserItems”作为散列,但我不确定这是否是一种好的做法,因为Users表中单个行的大小将非常大(我们可能有500个唯一项每个用户),每次我从/向“用户”提取/放置数据时(大部分时间不需要“用户项目”数据),读/写吞吐量也将非常大。

我应该怎么做,保持多个表的设计和手动处理交易或切换到单表设计?或者也许有第三种选择?

更新:我的使用情况的详细信息

目前,我有2个表

  • 用户:用户ID(键),用户名,黄金
  • UserItems:用户ID(分区键) ItemId(排序键),名称,GoldValue

方案:

  1. 用户购买一个项目:Users.Gold将被推断,新的UserItem将被添加到UserItems表中。
  2. 用户出售一个项目:Users.Gold将增加,Item将从UserItems表中删除。

在上述两种情况下,我将不得不对2个表进行2次更新操作,如果没有事务,则有可能其中一个失败。

为了解决这个问题,我考虑使用单表解决方案,这是一个单用户表,包含4列UserId(key),Username,Gold和UserItems。但有两件事我很担心:

  1. UserItems中的数据对于单个单元格可能会很大,因为一个用户最多可能有500个项目。
  2. 添加/删除项目我必须从dynamodb中添加UserItems,添加/删除项目,然后将其放回到用户中。所以我必须为1个动作进行1次读取和1次写入操作。由于问题(1),读/写数据大小可能变得非常大。

回答

0

NoSql数据库最适合于非事务性数据。如果你把规范化(把你的数据分成多个表)到noSQL中,那么你就是在打败它的全部目的。如果性能是最重要的,那么你应该考虑只为你的用例使用一张表。 DynamoDB支持范围键,并且还支持辅助索引。对于您的用例,重新设计您的表以使用范围键会更好。 如果你可以分享关于你当前表格的更多细节,也许我可以帮助你更多的输入。

+0

感谢您的回答。看来单桌是我用例的解决方案。尽管如此,我仍然担心单行内的数据大小以及将所有内容存储在单个表中时的读/写过程。我已经更新了我的问题。我希望它能帮助你理解我的情况。 –

+0

https://aws.amazon.com/blogs/developer/performing-conditional-writes-using-the-amazon-dynamodb-transaction-library/ –

+0

不幸的是,我使用NodeJs进行Lambda,并且没有事务库JS呢。 –