【问题标题】:DynamoDB : Good practice to use a timestamp field in a Primary KeyDynamoDB:在主键中使用时间戳字段的良好做法
【发布时间】:2022-10-24 16:27:57
【问题描述】:

我想从 DynamoDB 表中存储和检索数据。

我的数据(一个项目=用户对应用程序功能的评论)具有以下属性:

user        string 
feature     string
appVersion  string
timestamp   string 
rate        int   
description string 

该应用程序的多个版本上有多个功能,用户可以对这些功能进行多次评论。所以我想使用 (user, appVersion, feature, timestamp) 作为主键。

但似乎不可能在 DynamoDB 的主键中使用那么多属性。

我实现的第一个解决方案是将user 用作Partition Key,并将(appVersionfeaturetimestamp)的哈希用作Sort Key(在一个名为reviewID 的新字段中)。

我的问题是,我想在不知道timestamp 值的情况下检索给定userfeatureappVersion 的项目(假设我想要具有最新timestamp 或列表的项目所有与 3 个字段匹配的项目)

在不知道timestamp 的情况下,我无法构建检索我的项目所必需的Sort Key。但是,如果我从Sort Key 中删除timestamp,我将无法存储具有相同的多个项目(userappVersionfeature)。

处理这个用例的正确方法是什么?

我正在考虑使用(userappVersionfeature)的哈希作为Partition Key,并将timestamp 作为Sort Key,这是一个正确的解决方案吗?

【问题讨论】:

    标签: amazon-dynamodb primary-key


    【解决方案1】:

    将时间戳放在您的 SK 末尾,然后当您在 SK 上查询您使用的数据时开始使用。

    PK       SK
    UserID   appVersion#feature#timestamp
    

    这将允许您动态查询数据。例如,您希望所有用户都为特定的 appversion 投票

    SELECT * FROM Mytable WHERE PK= 'x' AND SK BEGINS_WITH('{VERSION ID}')
    

    这是使用查询命令完成的。

    【讨论】:

    • 在这种情况下,如何检索最新的 timestamp 的项目?我应该检索所有项目WHERE PK= 'x' AND SK BEGINS_WITH('{VERSION ID}#{FEATURE ID}'),然后在我的代码中找到最新的?
    • 您只能获取给定 appVersion + 功能的最新项目。字符串在 DynamoDB 中按 ASC 顺序按字典顺序排序,因此您将传递参数 ScanIndexForward=FALSELimit=1 以反转排序顺序并仅返回 1 个项目。
    【解决方案2】:

    单程

    HASH string "modelName": "user"
    RANGE string "id": "b0d5be50-4fae-11ed-981f-dbffcc56c88a"
    

    uuid 自己可以用作时间戳

    搜索时,您可以使用反向索引进行搜索


    另一种方式

    HASH string "modelName": "user"
    RANGE string "createdAt" "2019-10-12T07:20:50.52Z"
    

    createdAt,使用时间格式 rfc3339

    搜索时,您可以使用反向索引进行搜索


    把你需要的东西写在纸上,你会找到其他方法来管理 indes HASH/RANGE

    【讨论】:

      【解决方案3】:

      Lee Hannigan 的回答会奏效,我喜欢它。

      但是,请记住,访问 PK 非常快,因为它是基于散列的。

      我正在考虑使用 (user, appVersion, feature) 作为 分区键和作为排序键的时间戳,这将是 正确的解决方案?

      这也可能有效,表格看起来像这样

      PK                              SK
      {User}#{appVersion}#{feature}   timestamp
      

      如果你总是知道用户、appVersion 和特性,这将更加优化,因为 SK 查找是 O(logN)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-01
        • 2018-05-14
        • 2016-04-22
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多