如何基于 DynamoDB 复合排序键定义高效的范围查询?
How can I define an efficient range query based on a DynamoDB composite sort key?
使用复合排序键,可以在数据中定义分层(一对多)关系,可以在层次结构的任何级别进行查询。
例如,在 table 列出的地理位置中,排序键的结构如下:
[country]#[city]#[founded_date]#[population]
基于 best practices 使用排序键来组织数据,应该可以对这些聚合级别(从国家/地区到人口)中的任何一个级别的位置列表进行有效的范围查询,以及介于两者之间的一切。
如何编写查询,例如获取城市名称以 "new" 开头且成立于 1923 年 3 月 14 日之前且人口大于 100'000 的所有项目?
您引用的示例 100% 是关于分层数据的。您在其中引入了非分层数据,这完全打破了这种模式。在示例中,如果不先了解国家、地区、州和县,就无法找到以“new”开头的城市。层次结构模型假定您始终在层次结构的已知部分内进行搜索,并希望获取其下方的所有内容。当他们说“介于两者之间的所有内容”时,他们的意思是您可以在任何这些级别进行查询,而不是您可以查询任何这些元素。例如,您可以通过指定国家、地区和州来查询纽约州的每个位置。您可以通过指定国家、地区、州、县和城市来查找纽约市的所有内容。
[country]#[region]#[state]#[county]#[city]#[neighborhood]
要完成您想做的事情,您需要支持一些完全不同的访问模式。您可能需要一组 GSI 来允许您拥有不同的访问模式,并且可能需要进行一些超出您可以存储在密钥中的过滤。请记住,NoSQL 完全是关于访问模式的。您应该花一些时间弄清楚它们是什么,一旦您这样做了,您就可以弄清楚如何存储您的数据,包括支持您需要访问数据的方式所需的任何索引。
使用复合排序键,可以在数据中定义分层(一对多)关系,可以在层次结构的任何级别进行查询。
例如,在 table 列出的地理位置中,排序键的结构如下:
[country]#[city]#[founded_date]#[population]
基于 best practices 使用排序键来组织数据,应该可以对这些聚合级别(从国家/地区到人口)中的任何一个级别的位置列表进行有效的范围查询,以及介于两者之间的一切。
如何编写查询,例如获取城市名称以 "new" 开头且成立于 1923 年 3 月 14 日之前且人口大于 100'000 的所有项目?
您引用的示例 100% 是关于分层数据的。您在其中引入了非分层数据,这完全打破了这种模式。在示例中,如果不先了解国家、地区、州和县,就无法找到以“new”开头的城市。层次结构模型假定您始终在层次结构的已知部分内进行搜索,并希望获取其下方的所有内容。当他们说“介于两者之间的所有内容”时,他们的意思是您可以在任何这些级别进行查询,而不是您可以查询任何这些元素。例如,您可以通过指定国家、地区和州来查询纽约州的每个位置。您可以通过指定国家、地区、州、县和城市来查找纽约市的所有内容。
[country]#[region]#[state]#[county]#[city]#[neighborhood]
要完成您想做的事情,您需要支持一些完全不同的访问模式。您可能需要一组 GSI 来允许您拥有不同的访问模式,并且可能需要进行一些超出您可以存储在密钥中的过滤。请记住,NoSQL 完全是关于访问模式的。您应该花一些时间弄清楚它们是什么,一旦您这样做了,您就可以弄清楚如何存储您的数据,包括支持您需要访问数据的方式所需的任何索引。