无服务器:定义动态数据库表,以便在2个范围键之间进行高效扫描



我正在尝试定义一个dynamodb表,这样我就可以根据多个范围轻松地对其进行筛选(datetype都不被认为是唯一的(。我最终得到了以下模式(从DynamoDB对辅助索引的查询中窃取,如何定义索引(,但对于主要用例(按2个范围过滤后返回数据(,它似乎不是特别有效。

type设置为主表上的一个范围,并将date设置为localSecondaryIndex是否更好。或者有没有其他方法可以保持与GSI相关的灵活性。

Properties:
TableName: TableName
AttributeDefinitions:
- AttributeName: id
AttributeType: S
- AttributeName: date
AttributeType: S
- AttributeName: type
AttributeType: S
KeySchema:
- AttributeName: id
KeyType: HASH
GlobalSecondaryIndexes:
- IndexName: dateIndex
KeySchema:
- AttributeName: date
KeyType: HASH
Projection:
ProjectionType: KEYS_ONLY
ProvisionedThroughput:
ReadCapacityUnits: 100
WriteCapacityUnits: 100
- IndexName: typeIndex
KeySchema:
- AttributeName: type
KeyType: HASH
Projection:
ProjectionType: KEYS_ONLY
ProvisionedThroughput:
ReadCapacityUnits: 100
WriteCapacityUnits: 100
ProvisionedThroughput:
ReadCapacityUnits: 100
WriteCapacityUnits: 100

如果您正在检索一个非常大的";日期";范围和多个不同的";类型";。但是,使用查询操作和适当的GSI而不是完全扫描可能会更好地检索您所说的属性。

选项1(GSI;类型";作为散列密钥;日期";作为Rangekey

这是你试图做的事情的常见解决方案;类型";您正在尝试查找给定的日期范围。范围键上的键条件将用于匹配您的日期范围。如果您需要查询多个";类型";在一个日期范围内,您将执行多个查询操作(每个"类型"一个(。

选项2(在聚合柱上的GSI";TypeWithDate">

创建具有新属性"的GSI;TypeWithDate";作为散列密钥,该散列密钥将是";类型";以及";日期";(例如"mytype#2020-07-17"(。直接查询数据以查找匹配的关键字。如果你有一个有限的数字";日期";要搜索的范围,或者如果您正在查找的日期范围是分段的。只需对它们进行迭代。

选项3(客户端过滤

可能效率不高,但可以避免创建额外的GSI。你会重复使用";日期";GSI您可以在上面进行多次查询调用(在"日期"中每天一次(,然后进行客户端过滤以获得"日期";类型";

对于上面的所有选项,查询操作可以返回多个记录,因此需要多次调用来对所有结果进行分页。如果您的";日期";列包含时间以及查询"的选项;日期";如果您创建一个单独的";日期";列,或者创建一个粒度来权衡您要查询的单个键的数量。例如";2020-07-17T14:00:00";可以映射到"小时"的日期桶;2020-07-17.14";,但对于选项2和3,这需要每天24次查询查找。

最新更新