我是NoSQL和DynamoDB的新手,并且曾经使用RDBMS。我正在为一个游戏设计数据库,并且后端使用DynamoDB和AWS Lambda。我为播放器配置文件创建了一个表名“ Users”,其中包含用户信息和资源。因为游戏具有库存系统,所以我还创建了一个表名“ UserItems”。
直到我意识到DynamoDB没有事务,并且在两个表上执行的任何操作(例如,使用增加资源的项目)都在一个表上失败而在另一个表上成功而又会导致丢失数据而影响到这一切,这一切都很好我们的顾客。
所以我想也许我的多表设计不好,因为在使用RDBMS时,这是我习惯设计多表的习惯。这让我想到了将整个“ UserItems”存储为“ Users”中的哈希,但是我不确定这是一个好习惯,因为Users表中单行的大小真的会很大(我们可能有500个唯一项每个用户),每次我从“用户”提取数据或将数据放入“用户”时(大多数时候不需要“ UserItems”数据),读/写吞吐量也将非常大。
我应该怎么做,保持多表设计并手动处理事务,或者切换到单表设计?或者,也许有第三个选择?
更新:有关我的用例的更多信息
目前我有2张桌子
用户:UserId(密钥),用户名,金牌
UserItems:UserId(分区键),ItemId(排序键),名称,GoldValue
场景:
用户购买商品:将推导出Users.Gold,将新的UserItem添加到UserItems表中。
用户出售商品:Users.Gold将增加,该商品将从UserItems表中删除。
在以上两种情况下,我都必须对2个表进行2个更新操作,如果没有事务处理,则其中的一个可能会失败。
为了解决该问题,我考虑使用单表解决方案,该解决方案是具有4列UserId(key),Username,Gold,UserItems的单个Users表。但是,我担心两件事:
对于单个单元格,UserItems中的数据可能会变大,因为一个用户最多可以拥有500个项目。
要添加/删除项目,我必须从dynamodb中拉出UserItems,添加/删除项目,然后将其放回Users中。因此,我必须对1个动作执行1个读取和1个写入操作。并且由于问题(1),读/写数据大小可能真的很大。
最佳答案
NoSql数据库最适合非事务性数据。如果将规范化(将数据拆分到多个表中)引入noSQL,那么您将击败它的全部目的。如果性能是最重要的,那么您应该考虑只为您的用例准备一个表。 DynamoDB支持范围键,也支持辅助索引。对于您的用例,最好重新设计表以使用范围键。
如果您可以共享有关当前表的更多详细信息,也许我可以为您提供更多帮助。
关于amazon-web-services - DynamoDb表设计:单表或多表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41366955/