Database Design Guide
Общие правила
- В качестве СУБД РЕКОМЕНДУЕТСЯ использовать PostgreSQL, за исключением случаев когда для реализации задач решаемых сервисом другая технология является объективно предпочтительнее.stgreSQ
Внедрение платформы может потенциально использовать MySQL вместо PostgreSQL. Однако, это потребует существенных доработок непосредственно в рамках этого внедрения. В ходе разработки платформы РЕКОМЕНДУЕТСЯ избегать специфичной для PostgreSQL функциональности чтобы не увеличивать размер этих потенциальных доработок.
PostgreSQL
- В названии всех объектов (базы данных, схемы, индексы, вью, столбцы, триггеры и т т д) ДОЛЖНЫ использоваться только латинские символы в нижнем регистре, цифры и нижнее подчеркивание
- Название объекта ДОЛЖНО начинаться с буквы в нижнем регистре
- РЕКОМЕНДУЕТСЯ использовать только схему public. Это повышает взаимозаменяемость с MySQL, а также упрощает конфигурирование фреймворков вроде Laravel
- В качестве кодировки необходимо использовать UTF8
- РЕКОМЕНДОВАНО организовывать аутентификацию таким образом чтобы каждое приложение/сервис имело своего собственного пользователя
Таблицы
- Название таблиц и представлений должно быть во множественном числе - users вместо user
- Таблицы соединений (pivot tables) РЕКОМЕНДУЕТСЯ именовать соединяя единственное число сущностей. Сущности располагаем в алфавитном порядке. Пример: addresses, users -> address_user
Столбцы
- Таблица всегда ДОЛЖНА иметь первичный ключ
- Столбец являющиеся первичным ключом РЕКОМЕНДОВАНО называть id
- Столбцы ссылающиеся на первичные ключи РЕКОМЕНДОВАНО называть в формате [сущность в единственном числе]_[название столбца с первичным ключом]. Пример: для первичного ключа customers.id используем внешний ключ customer_id
Типы некоторых столбцов
Поле | Рекомендуемы тип | Комментарий | Laravel migration |
---|---|---|---|
id | bigserial 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'); |
Индексы и ограничения
- Название индекса/ограничения ДОЛЖНО соответствовать шаблону
([schema])\_[table]\_[column1]\_[column2]\_[type]
.
Если используется схема public, то её можно опустить.
type
- тип индекса/ограничения:pk
- первичный ключ;foreign
- внешний ключ;unique
- уникальный индекс;index
- неуникальный индекс;Например, для таблицы
public.refunds
и столбцаcode
получаем уникальный индексrefunds\_code\_unique
Представления (View)
- В названии представления необходимо использовать префикс v_
- В названии материализованного представления необходимо использовать префикс mv_
Хранимые процедуры, функции и триггеры
- В названии хранимых процедур необходимо использовать префикс sp_
- В названии функций необходимо использовать префикс fn_
- В названии триггеров необходимо использовать префикс tr_ и суффикс условия срабатывания триггера (insert, update, delete)
Не рекомендовано к использованию для реализации бизнес-логики
- Пользовательские типы
- Курсоры
- Триггеры
- Хранимые процедуры
- Функции