Перейти к содержанию

Правила нормализации данных#

По умолчанию, нормализация не поддерживается. Предпочтительнее работать с плоскими структурами. Ниже приведены стратегии для нормализации потоков данных.

Object (вложенные структуры)#

Strategy: Unnest

Пример:

{
  "nm": {
    "name": "Футболка",
    "volume": 30
  }
}

Инструкция:

  1. Все ключи и значения вложенного объекта "поднимаются" в родителя.
  2. Атрибуты вложенного объекта переименовываются через префикс.

Результат:

{
  "nm_name": "Футболка",
  "nm_volume": 30
}

Array (списки)#

Strategy: Flatten

Нормализация списков не всегда целесообразна. В частности, списки с высокой размерностью могут быть не оптимальным выбором для хранения данных. Перед их использованием рекомендуется оценить необходимость их применения в конкретном сценарии.

Пример:

{
  "rid": 1,
  "statuses": [
    28,
    16,
    8
  ]
}

Инструкция:

  1. Приводим к 1 НФ, в ключ добавляем вложенные поля

Результат:

[
  {
    "rid": 1,
    "status": 28
  },
  {
    "rid": 1,
    "status": 16
  },
  {
    "rid": 1,
    "status": 8
  }
]

Аrray of object (список вложенных структур)#

Strategy: Join

Является частным видом стратегии Flatten

Пример:

{
  "shk_id": 777,
  "nm_id": 101,
  "seller_id": 555,
  "orders": [
    {
      "rid": 1001,
      "pickpoint_id": 123
    },
    {
      "rid": 1002,
      "pickpoint_id": 124
    }
  ]
}

Инструкция:

  1. Приводим к 1 НФ, в ключ добавляем вложенные поля.

Результат:

[
  {
    "shk_id": 777,
    "nm_id": 101,
    "seller_id": 555,
    "rid": 1001,
    "pickpoint_id": 123
  },
  {
    "shk_id": 777,
    "nm_id": 101,
    "seller_id": 555,
    "rid": 1002,
    "pickpoint_id": 124
  }
]

Спорные ситуации#

meta объекты#

В существующих потоках присутствуют объекты, содержащие техническую информацию. Структуру таких объектов трудно зафиксировать так как они меняются слишком часто и хаотично. В таких случаях, стоит уточнить содержание мета объектов и сценарии их использования.

В общем случае есть следующие варианты урегулирования:

  1. (Предпочтительный) убрать meta объект из контракта т.к. данные не нужны для аналитики.
  2. Оставить только нужные поля, поднять их на уровень объекта, от meta отказаться.
  3. Зафиксировать структуру meta и поддерживать ее актуальность.