【问题标题】:DynamoDB data model secondary index searchDynamoDB 数据模型二级索引搜索
【发布时间】:2015-11-05 09:26:04
【问题描述】:

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

 userID1         ['itemID1','itemID2','itemID3']
 userID2         ['itemID3','itemID2','itemID7']
 userID3         ['itemID3','itemID2','itemID1']

我们需要运行以下查询:

  • 给我特定用户的所有项目(列表)(简单)。
  • 给我所有拥有itemID3 的用户(正是我的问题)。

您将如何在 DynamoDB 中对此进行建模?

选项1,只有Hash键?即

    HashKey(users)  cartItems
    userID1         ['itemID1','itemID2','itemID3']
    userID2         ['itemID3','itemID2','itemID7']
    userID3         ['itemID3','itemID2','itemID1']

选项 2,Hash 和 Range 键?

    HashKey(users)  RangeKey(cartItems)
    userID1         ['itemID1','itemID2','itemID3']
    userID2         ['itemID3','itemID2','itemID7']
    userID3         ['itemID3','itemID2','itemID1']

但好像范围键只能是字符串、数字或二进制...

应该通过 2 个表来解决这个问题吗?你会如何为它们建模?

谢谢!

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    规则 1:DynamoDB 表中的范围键必须是标量,这就是为什么类型必须是 strings、numbers、boolean 或二进制文件。您不能采用 list、set 或 map 类型。

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

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


    如果您不经常使用输入项(例如 itemID3)查询用户,则使用 filter expression 的 Scan 操作可能会正常工作。要对数据建模,您可以使用用户 ID 作为 HASH 键和 cartItems 作为字符串集(SS 类型)属性。对于查询,您需要为Scan 操作提供filter expression,如下所示:

    contains(cartItems, :expectedItem)
    

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

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

    请注意,您需要为每个 CRUD 操作维护两个表中的数据,这对于 DynamoDB Streams 来说可能是微不足道的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 2021-05-15
      • 2019-01-14
      • 2018-11-08
      • 2014-08-15
      • 1970-01-01
      相关资源
      最近更新 更多