Перейти к основному содержимому

Database Design Guide

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

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

Внедрение платформы может потенциально использовать 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. Функции