我想从DynamoDB表中存储和检索数据。
我的数据(一项=用户对应用程序功能的评论(具有以下属性:
user string
feature string
appVersion string
timestamp string
rate int
description string
该应用程序的多个版本有多个功能,用户可以对这些功能进行多次评论。所以我想使用(user
,appVersion
,feature
,timestamp
(作为主键。
但是在DynamoDB中,在主键中使用那么多属性似乎是不可能的。
我实现的第一个解决方案是使用user
作为Partition Key
,并使用(appVersion
、feature
、timestamp
(的哈希作为Sort Key
(在名为reviewID
的新字段中(。
我的问题是,我想在不知道timestamp
值的情况下检索给定user
、feature
、appVersion
的项目(假设我想要具有最新timestamp
的项目,或与3个字段匹配的所有项目的列表(
如果不知道timestamp
,我就无法构建检索我的项目所需的Sort Key
。但是,如果我从Sort Key
中删除timestamp
,我将无法存储具有相同内容的多个项目(user
、appVersion
、feature
(。
处理这个用例的正确方法是什么?
我正在考虑使用(user
、appVersion
、feature
(的哈希作为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