DynamoDB 按 3 个字段查询

DynamoDB query by 3 fields

您好,我正在努力构建包含三个搜索字段的模式。 所以我将使用的两个主要查询是:

Get all files from a user within a specific folder ordered by date.

Get all files from a user ordered by date.

也许我想要的地方会有一个额外的查询:

All files from a user within a folder orderd by date and itemType == X

All files from a user orderd by date and itemType == X

因此用户 ID 必须是主键。

但是我应该使用什么作为我的 sortKey?。我尝试使用复合 sortKey,例如: FOLDER${folderID}#FILE{itemID}#TIME{$timestamp} 因为我不知道 itemID 我不能正确使用 beginsWith 表达式吗?

我能做的是按 beginsWith: folderID 过滤,但按日期降序排序将不起作用。

或者考虑到这些查询要求,我应该从 dynamoDB 转移到关系数据库吗?

如果您确定要使用 dynamoDB,您应该提前分析对此 table 的访问模式,并根据最频繁的模式选择部分 key, sort key。对于其他模式,您应该为每个模式添加 GSI。参见 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

通常,如果是关于未知模式,RDBMS 看起来更好,或者对于 HighLoad 系统 NO_SQL 用于高负载工作负载和定期将数据上传到 AWS RedShift 之类的东西。

DynamoDB 数据建模一开始可能会很困难,但听起来您的开端不错!

当你发现自己需要ID和按时间排序时,你应该知道KSUIDs。 KSUID 是唯一的 ID,可以按时间按字典顺序排序。这意味着您可以对 KSUID 进行排序,它们将按创建时间排序。这在 DynamoDB 中非常有用。我们来看一个例子。

在建模用户和文件夹之间的 one-to-many 关系时,您可能会这样做:

在这个例子中,ID为1的User有三个ID分别为1、2、3的文件夹,但是我们如何按时间排序呢?让我们看看同样的 table 与文件夹 ID 的 KSUID 是什么样子的。

在这个例子中,我用 KSUID 替换了普通的 ol' ID。这不仅给我一个唯一的标识符,而且还确保我的文件夹项目按创建日期排序。很整洁!

有几种按 itemType 筛选的解决方案,但我可能会从全局二级索引开始,分区键为 USER#user_id#itemType,排序键为 FOLDER#folder_id。你的基础 table 看起来像这样

你的索引看起来像这样

此索引允许您获取给定用户和 itemType 的所有项目或特定文件夹。

这些示例可能无法完全匹配您的访问模式,但我希望它们可以得到您的数据建模过程un-stuck!我看不出您的访问模式无法在 DynamoDB 中实现的任何原因。