如何在dynamoDB,嵌套字典或多个项目中构建数据?

问题描述 投票:0回答:1

我从自动化测试生成的XML聚合,我在lambda函数中使用python来解析XML并创建dynamoDB项。

最后,我需要每个测试的日期运行测试持续时间,并将计算一些基本的统计数据,如mean,stdev等。

目前,我使用的是非常扁平的结构:

{
  "testName": string
  "result": "SUCCESS",
  "testEndedAt": timecode,
  "testStartedAt": timecode,
  "testRunID": string,
  "timeAdded": time,
  "totalTime": number
}

每次测试运行都会生成一个具有相同测试名称的新项目。

我使用testName和testrunID作为主键和排序键。

我有一种感觉,就是我做某事的方式效率低下。我正在考虑转移到这样的数据结构:

{
    testname:string,
    tests:[
            {
                timeAdded:timeStamp
                testRunId:string,
                testStartedAt:number,
                testEndedAt:number,
                totalTime:number
            }
            {
                timeAdded:timeStamp
                testRunId:string,
                m__testStartedAt:number,
                m__testEndedAt:number,
                totalTime:number
            }
    ],
    stats:{
        mean:number
        stDev:number
        maxExpectedTime:number
    }
}

我认为这种方法有几个优点。

我将计算出的统计数据存储在表格中我可以使用测试名称和唯一键我不必扫描整个数据库来计算统计数据等

对此我没什么经验,我不知道如何最好地处理这个问题,更不用说回答它了。

谢谢您的帮助!

database dictionary data-structures nosql amazon-dynamodb
1个回答
0
投票

您可以继续使用原始结构:

{
  "testName": string
  "result": "SUCCESS",
  "testEndedAt": timecode,
  "testStartedAt": timecode,
  "testRunID": string,
  "timeAdded": time,
  "totalTime": number
}

这样,您可以轻松查询(不扫描)特定testName的结果。您可以对结果数据进行聚合操作,并将其保存回具有不同GSI的同一个表。 (分区键为testName)。

{
  "testName": string
  "mean": "number",
  "stDev": number,
  "maxExpectedTime": number
}

如果您希望这些聚合统计信息是实时启用,并将此表的流发送到lambda函数。根据新数据增加这些计数。