在DynamoDB中设计表

我是一个NoSQL DB和Serverless的初学者。我的应用程序有一个叫做 Trips. 这些表格的参数是: {id, route, cost, selling, type, date, LR, asset } 和其他一堆不相关的文档编号,其中id是由uuid生成的。

现在我想查询数据库,以便给我提供

  1. 使用日期参数,返回一个日期范围内的所有行程。
  2. 使用日期和资产参数,返回一个资产在给定时间段内的所有行程。
  3. 使用date route参数返回给定时间段内的所有路线行程。

2和3使用keyConditionExpression工作得很好,但对于1,我需要在扫描中使用filterExpression而不是查询,这可能会使它相对较慢,因为一旦查询完成,它就会被执行。有没有更好的方式来形成模式?

Trips 表的模式是这样的

 tripTable:
  Type: "AWS::DynamoDB::Table"
  Properties:
    AttributeDefinitions:
      [
        { "AttributeName": "id", "AttributeType": "S" },
        { "AttributeName": "date", "AttributeType": "S" },
        { "AttributeName": "Asset", "AttributeType": "S" },
        { "AttributeName": "Route", "AttributeType": "S" },
      ]

    KeySchema:
      [
        { "AttributeName": "date", "KeyType": "HASH" },
        { "AttributeName": "id", "KeyType": "RANGE" },
      ]
    ProvisionedThroughput:
      ReadCapacityUnits: 5
      WriteCapacityUnits: 5
    StreamSpecification:
      StreamViewType: "NEW_AND_OLD_IMAGES"
    TableName: ${self:provider.environment.TRIPS}
    GlobalSecondaryIndexes:
      - IndexName: TripsVSAssets
        KeySchema:
          - AttributeName: asset
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE
        Projection:
          ProjectionType: ALL
        ProvisionedThroughput:
          ReadCapacityUnits: "5"
          WriteCapacityUnits: "5"
        GlobalSecondaryIndexes:
      - IndexName: RoutesVSAssets
        KeySchema:
          - AttributeName: route
            KeyType: HASH
          - AttributeName: date
            KeyType: RANGE
        Projection:
          ProjectionType: ALL
        ProvisionedThroughput:
          ReadCapacityUnits: "5"
          WriteCapacityUnits: "5"

解决方案:

我最近也遇到了类似的问题,我选择了使用 year 作为分区键,日期作为排序键。这对我的数据量来说是正确的,让我可以按日期查询,而且大部分时候只是运行一个查询。如果你有很多数据,也许可以用 month 甚至 week 会更合适(或者完全是别的什么)。

在我的方法中,我只需要检查我要查看的日期范围是否跨越了两年,在这些情况下(即很少),Lambda会进行两次查询并将结果合并。我在下面附上了一些代码草案,以备不时之需(可能还有更好的方法,但这对我来说是有效的!),我还推荐这篇快速阅读。https:/aws.amazon.comlogsdatabasechoosing-theright-dynamodb-partition-key。.

module.exports.getLatest = async event => {

  // some date and formatting code here not included

  var params1 = {
    ExpressionAttributeNames: { "#date": "date", "#year": "year" },
    ExpressionAttributeValues: {
      ':d': isoDate,
      ':y1': y1
     },
   KeyConditionExpression: '#year = :y1 AND #date > :d',
   TableName: process.env.HEADLINES_TABLE
  }

  if (y1 != y2) {
   // define var params2 (the same as params1 except it uses y2)
  }

  try {
    let result;

    // if the date range cuts across partitions (years), fire off two queries and wait for both

    if(y1 != y2) {
        let resultPromise1 = client.query(params1).promise();
        let resultPromise2 = client.query(params2).promise();
        const [result1, result2] = await Promise.all([resultPromise1,resultPromise2]);
        result = [...result1.Items, ...result2.Items];
    } else { 
        result = await client.query(params1).promise();
    }

    return {
      // stringify and return result.Items, statuscode 200 etc.
    }
  }
  // catch {} code here (irrelevant for the answer)
}

给TA打赏
共{{data.count}}人
人已打赏
未分类

预订后显示保留时出现ArrayIndexOutOfBounds异常的错误 - Java。

2022-9-9 3:18:18

未分类

如何在Tableau中写动态sql查询?

2022-9-9 3:18:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索