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

时间:2019-04-29 09:02:57

标签: database dictionary data-structures nosql amazon-dynamodb

我正在汇总自动化测试生成的XML,在lambda函数中使用python解析XML并创建dynamoDB项。

最后,我需要每次测试的日期以及测试持续时间,并将计算一些基本统计信息,例如均值,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
    }
}

我看到这种方法有两个优点。

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

对此我几乎没有经验,我不知道如何最好地解决这个问题,更不用说回答它了。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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函数。根据传入的新数据增加这些计数。

答案 1 :(得分:0)

做这样的事情永远不是一个好主意: 测试:[...],此后在测试内部添加行。

为什么?

  1. 要在测试中添加新行,您必须阅读该项目,将其压入阵列并保存回去。每次写入都有一个额外的读取。

  2. 由于您正在读取数据并将其写回,因此有可能同时读取/写入 tests 属性,从而导致数据丢失。我已经看到了它的发生。

  3. dynamodb中的项目大小限制为400k,因此您的测试数组只能添加有限的行数。