Как структурировать данные в DynamoDB, вложенных словарях или нескольких элементах? - PullRequest
0 голосов
/ 29 апреля 2019

Я агрегирую из XML, сгенерированного нашими тестами автоматизации, я использую 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 голосов
/ 02 мая 2019

Никогда не рекомендуется делать что-то вроде: tests : [...] со строками, добавляемыми в последующие тесты.

Почему?

  1. Чтобы добавить новую строку в тесты, вы должны прочитать элемент, нажать на массив и сохранить обратно.Для каждой записи требуется дополнительное чтение.

  2. Поскольку вы читаете данные и записываете их обратно, возможно одновременное чтение / запись атрибута tests , в результате чегов потере данных.Я видел, как это происходит.

  3. В DynamodB есть ограничение на размер элемента в 400 КБ, поэтому ваш массив тестов имеет ограниченное количество строк, которые можно добавить.

0 голосов
/ 29 апреля 2019

Вы можете продолжить использовать исходную структуру:

{
  "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
}

Если вы хотите, чтобы эта совокупная статистика была включена в реальном времени, и отправляйте потоки для этой таблицы в лямбда-функцию. Увеличьте это число в соответствии с поступающими новыми данными.

...