Skip to main content

Database Design Guide

Общие правила#

  1. В качестве СУБД РЕКОМЕНДУЕТСЯ использовать PostgreSQL, за исключением случаев когда для реализации задач решаемых сервисом другая технология является объективно предпочтительнее.stgreSQ
info

Внедрение платформы может потенциально использовать MySQL вместо PostgreSQL. Однако, это потребует существенных доработок непосредственно в рамках этого внедрения. В ходе разработки платформы РЕКОМЕНДУЕТСЯ избегать специфичной для PostgreSQL функциональности чтобы не увеличивать размер этих потенциальных доработок.

PostgreSQL#

  1. В названии всех объектов (базы данных, схемы, индексы, вью, столбцы, триггеры и т т д) ДОЛЖНЫ использоваться только латинские символы в нижнем регистре, цифры и нижнее подчеркивание
  2. Название объекта ДОЛЖНО начинаться с буквы в нижнем регистре
  3. РЕКОМЕНДУЕТСЯ использовать только схему public. Это повышает взаимозаменяемость с MySQL, а также упрощает конфигурирование фреймворков вроде Laravel
  4. В качестве кодировки необходимо использовать UTF8
  5. РЕКОМЕНДОВАНО организовывать аутентификацию таким образом чтобы каждое приложение/сервис имело своего собственного пользователя

Таблицы#

  1. Название таблиц и представлений должно быть во множественном числе - users вместо user
  2. Таблицы соединений (pivot tables) РЕКОМЕНДУЕТСЯ именовать соединяя единственное число сущностей. Сущности располагаем в алфавитном порядке. Пример: addresses, users -> address_user

Столбцы#

  1. Таблица всегда ДОЛЖНА иметь первичный ключ
  2. Столбец являющиеся первичным ключом РЕКОМЕНДОВАНО называть id
  3. Столбцы ссылающиеся на первичные ключи РЕКОМЕНДОВАНО называть в формате [сущность в единственном числе]_[название столбца с первичным ключом]. Пример: для первичного ключа customers.id используем внешний ключ customer_id

Типы некоторых столбцов#

ПолеРекомендуемы типКомментарийLaravel migration
idbigserial primary keyрекомендуется именно big

$table->id(); который внутри уже сам вызывает

$table->bigIncrements('id');

ценаbigint в копейках$table->bigInteger('price');
Временные метки (created_at, updated_at, email_verified_at)timestamp без таймзоны

Временная метка должна быть в UTC

Рекомендуется создавать с c precision = 6, чтобы поддерживать точность до микросекунд

$table->timestamp('email_verified_at', 6);
Дата (для тех случаев когда нужна именно дата, а не временная метка события. Например - дата рождения пользователя)date$table->date('birthday');

Индексы и ограничения#

  1. Название индекса/ограничения ДОЛЖНО соответствовать шаблону ([schema])\_[table]\_[column1]\_[column2]\_[type].

Если используется схема public, то её можно опустить.

  • type - тип индекса/ограничения:

  • pk - первичный ключ;

  • foreign - внешний ключ;

  • unique - уникальный индекс;

  • index - неуникальный индекс;

    Например, для таблицы public.refunds и столбца code получаем уникальный индекс refunds\_code\_unique

Представления (View)#

  1. В названии представления необходимо использовать префикс v_
  2. В названии материализованного представления необходимо использовать префикс mv_

Хранимые процедуры, функции и триггеры#

  1. В названии хранимых процедур необходимо использовать префикс sp_
  2. В названии функций необходимо использовать префикс fn_
  3. В названии триггеров необходимо использовать префикс tr_ и суффикс условия срабатывания триггера (insert, update, delete)

Не рекомендовано к использованию для реализации бизнес-логики#

  1. Пользовательские типы
  2. Курсоры
  3. Триггеры
  4. Хранимые процедуры
  5. Функции