DynamoDB:在主键中使用时间戳字段的良好做法



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

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

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

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

但是在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,这是正确的解决方案吗?

将时间戳放在SK的末尾,然后在查询数据时在SK上使用begins_with.

PK       SK
UserID   appVersion#feature#timestamp

这将允许您动态查询数据。例如,您希望所有用户投票支持特定的应用程序版本

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

这是使用Query命令完成的。

Lee Hannigan的答案会起作用,我喜欢。

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

我正在考虑使用(user,appVersion,feature(的哈希作为分区键,时间戳作为排序键,这会是一个正确的解决方案?

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

PK                                                     SK
User#{User}AppVersion#{appVersion}#Feature#{feature}   TimeStamp#{timestamp}

如果你总是知道用户、appVersion和功能,这将是更优化的,因为SK查找是O(logN(

单向

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

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


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

最新更新