DynamoDB数据模型二级索引搜索

时间:2015-08-12 16:31:52

标签: amazon-dynamodb

民间,   鉴于我们必须存储以下购物车数据:

 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个表来解决吗?你会如何塑造它们?

谢谢!

1 个答案:

答案 0 :(得分:3)

规则1:DynamoDB表中的范围键必须是标量,这就是为什么类型必须是字符串数字布尔< / em>或二进制文件。您无法获取列表设置地图类型。

规则2:您不能(当前)从嵌套属性创建二级索引。来自Improving Data Access with Secondary Indexes in DynamoDB documentation。这意味着,您无法索引cartItem,因为它不是顶级JSON属性。您可能需要另一张表格。

因此,对您的问题的简单回答是另一个问题:您如何使用数据?

如果您不经常查询输入项目(例如您的itemID3)的用户,那么使用filter expressionScan操作可能会正常运行。要对数据建模,可以使用用户标识作为HASH密钥,将cartItems用作字符串集(SS类型)属性。对于查询,您需要为filter expression操作提供Scan,如下所示:

contains(cartItems, :expectedItem)

并在参数itemID3中为占位符:expectedItem提供值valueMap

如果您经常运行这样的许多查询,也许您可​​以创建另一个表,将项目ID作为HASH键,并将具有该项目的用户组作为字符串集属性。在这种情况下,您问题中的第二个查询结果是另一个表中的第一个查询。

请注意,您需要为每个CRUD操作维护两个表的数据,这对于DynamoDB Streams来说可能很简单。