我们正在考虑将 DynamoDB 用于预期的大型数据集。我有很强的 SQL 背景,所以 No-SQL 的思维方式对我来说是全新的。
我有一个问题和设计,但遇到了一个看似死胡同的地方。
文档说要确保你的哈希键被广泛分布以帮助提高性能,好吧,这是有道理的。
我将为用户记录各种数据点/操作。散列键应该是用户 ID,而我的范围键可以是执行的操作,这对我来说很有意义。
现在,如果我想要用户 #1 执行的所有操作,我可以轻松查询。
但是,如果我想要所有执行了操作 X 的用户,我无法在没有表扫描的情况下做到这一点。来自Query documentation :
A Query operation directly accesses items from a table using the table primary key, or from an index using the index key. You must provide a specific hash key value.
所以我似乎仅限于从特定用户获取数据,除非我愿意做 table scan ,速度较慢且消耗许多容量单位。
我认为,我的问题最终是一个设计问题。也许我在 No-SQL 方面遗漏了什么?我的哈希键应该是别的东西吗?或者只是我的要求不适合 No-SQL(更具体地说,DynamoDB)?
哈希键几乎就像是 DynamoDB 的一种分组。我考虑过将散列 key 更改为我们打算实现的操作,但我并没有广泛分发我的 key ......
最佳答案
DynamoDb 满足您允许两种类型查询的要求的方法是将数据存储在两个表中,一个具有散列键 user-id 和范围键 action-id,另一个具有散列键 action-id 和范围键用户 ID。
并且你应该考虑是否需要两个表中的所有数据,或者是否可以将一个表作为汇总表。例如,假设您的可能操作数量有限。不是将每个操作的完整记录放在用户键控表中,您可能希望每个用户只有一行的表:用户的散列键 - id,第二列是多值的并且是列表用户至少执行过一次的任何操作 ID。
关于nosql - Amazon DynamoDB 表设计和查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16203154/