民间, 鉴于我们必须存储以下购物车数据:
userID1 ['itemID1','itemID2','itemID3']
userID2 ['itemID3','itemID2','itemID7']
userID3 ['itemID3','itemID2','itemID1']
我们需要运行以下查询:
itemID3
(正是我的问题)的所有用户。您将如何在DynamoDB中对此进行建模?
选项1,只有哈希键?即
HashKey(users) cartItems
userID1 ['itemID1','itemID2','itemID3']
userID2 ['itemID3','itemID2','itemID7']
userID3 ['itemID3','itemID2','itemID1']
选项2,哈希和范围键?
HashKey(users) RangeKey(cartItems)
userID1 ['itemID1','itemID2','itemID3']
userID2 ['itemID3','itemID2','itemID7']
userID3 ['itemID3','itemID2','itemID1']
但似乎范围键只能是字符串,数字或二进制......
这应该通过2个表来解决吗?你会如何塑造它们?
谢谢!
答案 0 :(得分:3)
规则1:DynamoDB表中的范围键必须是标量,这就是为什么类型必须是字符串,数字,布尔< / em>或二进制文件。您无法获取列表,设置或地图类型。
规则2:您不能(当前)从嵌套属性创建二级索引。来自Improving Data Access with Secondary Indexes in DynamoDB documentation。这意味着,您无法索引cartItem,因为它不是顶级JSON属性。您可能需要另一张表格。
因此,对您的问题的简单回答是另一个问题:您如何使用数据?
如果您不经常查询输入项目(例如您的itemID3
)的用户,那么使用filter expression的Scan
操作可能会正常运行。要对数据建模,可以使用用户标识作为HASH
密钥,将cartItems用作字符串集(SS
类型)属性。对于查询,您需要为filter expression
操作提供Scan
,如下所示:
contains(cartItems, :expectedItem)
并在参数itemID3
中为占位符:expectedItem
提供值valueMap
。
如果您经常运行这样的许多查询,也许您可以创建另一个表,将项目ID作为HASH
键,并将具有该项目的用户组作为字符串集属性。在这种情况下,您问题中的第二个查询结果是另一个表中的第一个查询。
请注意,您需要为每个CRUD操作维护两个表的数据,这对于DynamoDB Streams来说可能很简单。