我是NoSQL和DynamoDB的新手,我习惯使用RDBMS。我正在为游戏设计数据库,我们正在使用DynamoDB和AWS Lambda作为后端。我为包含用户信息和资源的播放器配置文件创建了一个表名“Users”。因为游戏有库存系统,我还创建了一个表名“UserItems”。
直到我意识到DynamoDB没有事务并且在两个表上执行的任何操作(例如使用增加资源的项目)在一个表上有可能失败而在另一个表上成功并且将导致丢失时,这一切都很好影响我们客户的数据。
所以我想也许我的多个表设计不好,因为我习惯在设计多个表时使用RDBMS。这让我想到将整个“UserItems”存储为“用户”中的哈希,但我不确定这是一个好习惯,因为Users表中单行的大小会非常大(我们可能有500个唯一的项目)每个用户)并且每次从/向“用户”提取或放置数据(大多数时候不需要“UserItems”数据),读/写吞吐量也会非常大。
我该怎么做,保持多个表设计并手动处理事务或切换到单表设计?或者可能有第三种选择?
已更新:有关我的用例的更多信息
目前我有2张桌子
场景:
在上述两种情况下,我将不得不对2个表进行2次更新操作,如果没有交易,其中一个可能会失败。
为了解决这个问题,我考虑使用单表解决方案,它是一个包含4列UserId(key),Username,Gold,UserItems的单个Users表。但是我有两件事需要担心:
答案 0 :(得分:5)
NoSql数据库最适合非交易数据。如果你将规范化(将你的数据分成多个表)带入noSQL,那么你就是在打败它的全部目的。如果性能最重要,那么您应该考虑只为您的用例使用一个表。 DynamoDB支持范围键,也支持辅助索引。对于您的用例,最好重新设计表以使用Range Keys。 如果您可以分享有关当前表格的更多详细信息,也许我可以为您提供更多输入。
答案 1 :(得分:5)
FWIW,NoSQL Design for DynamoDB上的AWS文档建议使用一个表:
通常,您应在一个 DynamoDB应用程序。如前所述,设计得最好 除非有特定原因,否则应用程序仅需要一张桌子 使用多个表。
例外情况是涉及大量时间序列数据, 或具有非常不同的访问模式的数据集,但是这些是 例外情况。具有反向索引的单个表通常可以启用 简单查询即可创建和检索复杂的分层数据 您的应用程序所需的结构。