DynamoDB 分层、排序查询

0

【以下的问题经过翻译处理】 我想要能够逐层查询数据并按另一个属性排序返回结果。存储和查询已排序的层次数据的最有效方法是什么?

例如,如果我有一个包含四个属性的表:customer_idcountrylocationlast_updated_date,其中location包含像state:county:city这样的层次信息,所以几条记录可能是这样的:

------------|--------|-------------------|-------------|
customer_id |country |location           |last_updated |
------------|--------|-------------------|-------------|
123456      |USA     |WA:King:Seattle    |2022-03-18   |
789012      |USA     |WA:King:Kent       |2022-03-15   |
098765      |USA     |NY:Bronx:NYC       |2022-02-28   |
432109      |USA     |WA:Spokane:Spokane |2022-03-20   |

表的PKcustomer_id,因为大多数查询都会通过customer_id提取信息,但是还有其他用例希望(a)找到给定位置(例如statecounty)中的所有客户,并(b)将结果按last_updated排序(降序)。为了完成(a),我有一个具有country作为PKlocation作为SKGSI,使用location.begins_with查询GSI

但我无法弄清楚如何完成(b)。我的理解是排序操作通常使用scanIndexForward执行,但我已经在使用GSI进行层次查询了。是否有一种方法可以同时完成(a)和(b)?

谢谢!

profile picture
专家
已提问 8 个月前12 查看次数
1 回答
0

【以下的回答经过翻译处理】 创建一个GSI,其中PK是Country+Location连接起来的,而SK是last_updated。然后,对于任何给定的Country+Location值,您都可以找到该位置的最新更新值(以及投影中对应的客户ID)。请注意,您可以设置20个GSIs。

或者您是否希望针对位置(例如WA:King的更广泛价值)进行begins_with操作,同时仅获取最新的X个值?在这种情况下,您做不到。但是,您可以在每个分层级别(例如WA:King等)插入新项目,以便该值可以用作PK。基本上在每个级别上预材料化。每个表/索引只能获取一个排序键,并且不能两次使用排序键功能。

当然,如果您打算获取所有匹配的项(而不仅仅是最新的X个),并且只想对它们进行排序,您可以在客户端上进行排序。

profile picture
专家
已回答 8 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则