【发布时间】:2017-05-13 00:37:58
【问题描述】:
我对 NoSQL 和 DynamoDB 还很陌生,而且我习惯使用 RDBMS。我正在为游戏设计数据库,我们使用 DynamoDB 和 AWS Lambda 作为后端。我为包含用户信息和资源的玩家资料创建了一个表名“Users”。因为游戏有库存系统,所以我还创建了一个表名“UserItems”。
这一切都很好,直到我意识到 DynamoDB 没有事务并且在两个表上执行的任何操作(例如使用增加资源的项目)都有可能在一个表上失败而在另一个表上成功并且会导致丢失影响我们客户的数据。
所以我在想我的多表设计可能不好,因为我在使用 RDBMS 时设计多表是我的习惯。这让我想到将整个“UserItems”存储为“Users”中的哈希,但我不确定这是一个好习惯,因为 Users 表中单行的大小会非常大(我们可能有 500 个唯一项目每个用户),每次我从/向“用户”(大多数时候不需要“UserItems”数据)拉取或放入数据时,读/写吞吐量也会非常大。
我应该怎么做,保持多表设计并手动处理事务或切换到单表设计?或者也许有第三种选择?
更新:关于我的用例的更多信息
目前我有 2 张桌子
- 用户:UserId(密钥)、用户名、Gold
- UserItems:UserId(分区键)、ItemId(排序键)、名称、GoldValue
场景:
- 用户购买物品:将推导出Users.Gold,将新的UserItem添加到UserItems表中。
- 用户出售物品:Users.Gold 将增加,该物品将从 UserItems 表中删除。
在上述两种情况下,我都必须对 2 个没有事务的表执行 2 次更新操作,其中一个可能会失败。
为了解决这个问题,我考虑使用单表解决方案,这是一个包含 4 列 UserId(key)、Username、Gold、UserItems 的单用户表。但是有两件事我很担心:
- UserItems 中的数据对于单个单元格而言可能会变得很大,因为一个用户最多可以拥有 500 个项目。
- 要添加/删除项目,我必须从 dynamodb 中提取用户项目,添加/删除项目,然后将其放回用户。所以我必须为 1 次操作执行 1 次读取和 1 次写入操作。由于问题 (1),读/写数据的大小可能会变得非常大。
【问题讨论】:
标签: amazon-web-services amazon-dynamodb aws-lambda nosql