Регламент по неймингу и структуре хранения данных в Dremio

И снова привет, сейчас покажем как мы ведём у себя хранение данных в Dremio и как мы у себя условились называть датасеты и поля в них, приятного чтения! :mechanical_arm:

  1. Структуризация хранения

Для структурированного хранения данных существует система пространств (spaces) и папок (folders). Конкретно в этом разделе будет уделено внимание системе папок.

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

При уровневом подходе датасеты хранятся по своеобразным уровням (источники – в “подвале”, промежуточные переиспользуемые датасеты – на первом этаже, конечные – на втором).

Пример следующей уровневой структуры приведен ниже:

  • db_source – дубли таблиц из баз источников с необходимым набором полей;
  • L0 – первичная подготовка переиспользуемых данных (т.е. объемные датасеты, служащие источником для последующих трансформаций);
  • L1 – промежуточные датасеты;
  • L2 – конечные датасеты.

Не исключена ситуация с большИм количеством уровней, как и ситуация, когда такого строгого разделения придерживаться не получится, и конечные датасеты будут находиться на различных уровнях. Это нормальная ситуация, так как основная идея подобной структуры – иметь представление о преемственности датасетов (т.е. для датасетов на L0 источником могут служить только датасеты с уровня db_source/папки с загруженными файлами, для L1 – L0, для L2 – L0 и L1, и т.д.), то есть не должно быть ситуации, когда датасет ссылается на датасет, находящийся на том же уровне.

  1. Правила именования пространств

Для именования пространств с проектами используется имя проекта и имя решения на латинице. Не стоит писать англоязычных аналогов (только если у самого проекта нет англоязычного названия), лучше использовать транслит.

Чеклист для именования пространства с проектом:

  • транслит/прямое англоязычное название проекта+решения;
  • для разделения слов используется “_”;
  • только нижний кейс.

Т.е. если заказчик условный TTT, а решение называется Insight, то папка с проектом может называться ttt_insight.

Для именования папок с подпроектами применяются рекомендации по наименованию пространств.

Для именования папок по уровневной структуре:

  • db_source – папка с дублями таблиц из бд-источников;
  • file_source – папка с дублями загруженных файлов (если проект на отдельном инстансе возможно использовать папку в домашнем пространстве);
  • L[0-n] – наименования папок с уровнями.
  1. Правила именования датасетов

Общая схема:

(путь)(основная сущность)[(пояснение1)(пояснениеN)][(особенность1)(особенностьN)](виджет)

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

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

Пример: есть датасет с данными по постановке целей (оно же целеполагание). Отразить содержимое этого датасета с помощью английского достаточно сложно, т.к. не все видят разницу между английским словами goal (правильно) и target (неправильно), что затем может вылиться в недопонимания, особенно если использовать онлайн-переводчики.

Названия можно и нужно сокращать, если это возможно без потери смысла.

Писать названия сущностей рекомендуется в единственном числе в целях поддержания единообразия.

После выбора основного названия датасета к нему добавляются префиксы и постфиксы.

К префиксам относится место этого датасета в структуре проекта и название проекта. Т.е. если датасет находится по пути l1, префиксом будет l1_, а название проекта ttt, то ttt_ – первый префикс (на базе предыдущего примера: название примет вид ttt_l1_goal_setting).

К постфиксам относятся:

  • Дополнительные пояснения к сущности датасета (есть несколько датасетов с одной главной сущностью, но с некоторыми отличиями);
  • важные особенности датасета (наличие накопительного итога, форматированных полей, данные только в определенном временном/оргструктурном/ином разрезах);
  • Под какой инструмент визуализации (далее – виджет) подготовлен датасет, если он подготовлен под конкретный виджет.

Порядок в списке дан в порядке приписывания постфиксов к названию датасета.

На базе предыдущего примера:

  • На уровне L1 мы имеем подготовительный датасет по целеполаганию, значит следует добавить первый дополнительный постфикс, который будет говорить о том, что он подготовительный. Название примет вид ttt_l1_goal_setting_prep;
  • в этом датасете находятся данные агрегированные в разреза до подразделения и до месяца, значит добавляются следующие два постфикса: ttt_l1_goal_setting_div_month;
  • датасет подготовлен специально под виджет пайчарт (диаграмма-пирог), добавляется последний постфикс: ttt_l1_goal_setting_div_month_pie.

Ниже приведен список постфиксов для примера:

  • Подготовительный: prep(arational);
  • Агрегированный: aggr(egated);
  • Со всеми основными данными по сущности: main;
  • Во временных разрезах час/день/неделя/месяц/квартал/год: hour/day/week/month/quarter/year;
  • В оргструктурных разрезах: div(ision), store, manager;
  • Имеет накопительный итог: rolling;
  • Дубль с дополнительным форматированием: format(ted);
  • Для виджетов: pie(chart), bar(chart), spline, table.

Если для существующего датасета поменялась логика формирования, но выходной формат остался неизменным, - изменения вносятся в существующий датасет и именование полей менять нельзя.

Если для существующего датасета поменялась логика формирования, то старый необходимо переименовать в название_backup, чтобы сохранить предыдущую версию, и создать новый датасет с тем же названием.

  1. Правила именования полей

Общая схема:

(основная сущность)[(пояснение1)(пояснениеN)](тип данных)[(особенность1)_(особенностьN)]

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

Используется только латиница, только английские аналоги, только нижний кейс, слова разделяются “_”.

К постфиксам полей относятся:

  • Дополнительные пояснения к сущности поля (есть несколько полей с одной главной сущностью, но с некоторыми отличиями);
  • тип данных, хранящихся в поле;
  • важные особенности поля (наличие накопительного итога, форматирование, данные только в определенном временном/оргструктурном/ином разрезах).

Предположим, что в датасете есть поле с оргструктурным разрезом, поле с временным разрезом, поле со значением и поле с форматированным временным разрезом:

  • Выделяется главная сущность у каждого поля: division, date, revenue, date;
  • добавляются дополнительные пояснения к сущностям, где это необходимо: date_from, revenue_plan (в поле revenue хранятся плановые значения, date – зарезервированное слово в большинстве субд);
  • добавляются пояснения к типу данных в полях, где это необходимо: division_id, revenue_plan_value (в поле division находятся идентификаторы подразделений, в поле revenue_plan - числовые значения);
  • добавляются пояснения к важным особенностям поля, где это необходимо: revenue_plan_value_rolling, date_from_format (в поле revenue_plan_value находится накопительный итог, в форматированном поле date_from находится дата в другом формате для отображения на виджете).

Ниже приведен список постфиксов для примера, которые можно использовать:

  • Идентификатор: id;
  • Код (к примеру код подразделения по документам, но который не является идентификатором в данных): code;
  • Дата: from (с даты), to (по дату), week, month, quarter, year, prev (предыдущий период);
  • Время: from (с времени), to (по время);
  • Форматированные значения: format;
  • Наименования: name, short (сокращенное), full (полное), abbr (аббревиатура);
  • Текстовые значения: text, desc (описание);
  • Числовые значения: value, avg, count, quantity, diff (отклонение), percent (доля), max, min, total (если поле агрегировано до уровня выше минимального орг. разреза), hour, day, week, month, quarter, year, prev, rolling (накопительный итог);
  • Вспомогательные: key (ключ строки), weight (удельный вес), icon (иконка для виджета), photo (ссылка на фото), order (порядок сортировки).

1 лайк