Database Design Guide
Общие правила
- В качестве СУБД РЕКОМЕНДУЕТСЯ использовать PostgreSQL, за исключением случаев когда для реализации задач решаемых сервисом другая технология является объективно предпочтительнее.
Внедрение платформы может потенциально использовать MySQL вместо PostgreSQL. Однако, это потребует существенных доработок непосредственно в рамках этого внедрения. В ходе разработки платформы РЕКОМЕНДУЕТСЯ избегать специфичной для PostgreSQL функциональности чтобы не увеличивать размер этих потенциальных доработок.
PostgreSQL
- В названии всех объектов (базы данных, схемы, индексы, вью, столбцы, триггеры и т.д.) ДОЛЖНЫ использоваться только латинские символы в нижнем регистре, цифры и нижнее подчеркивание
- Название объекта ДОЛЖНО начинаться с буквы в нижнем регистре
- РЕКОМЕНДУЕТСЯ использовать только схему public. Это повышает взаимозаменяемость с MySQL, а также упрощает конфигурирование фреймворков вроде Laravel
- В качестве кодировки необходимо использовать UTF8
- РЕКОМЕНДУЕТСЯ организовывать аутентификацию таким образом чтобы каждое приложение/сервис имело своего собственного пользователя
Таблицы
- Название таблиц и представлений должно быть во множественном числе. Пример:
users
- РЕКОМЕНДУЕТСЯ не использовать обобщённые названия для таблиц. Например
types
,statuses
и другие слова, которые могут быть применимы в будущем к другим сущностям. В таких случаях лучше использовать префикс для уточнения. Примерcustomer_types
- В случаях, когда одна бизнес-сущность хранится в нескольких таблицах РЕКОМЕНДУЕТСЯ использовать общий префикс для дополнительных таблиц. Пример:
products
,product_images
, 'product_property_values' - Для составных названий только последнее ключевое существительное ДОЛЖНО быть во множественном числе. Пример: таблица для статусов товаров должна называться
product_statuses
. Неправильно:status_products
,products_status
,products_statuses
- Таблицы соединений (pivot tables) РЕКОМЕНДУЕТСЯ именовать соединяя единственное число сущностей и добавляя суффикс
_links
. Первым идёт название основной сущности. Пример:addresses
,users
->user_address_links
Столбцы
- Таблица всегда ДОЛЖНА иметь первичный ключ
- Столбец являющиеся первичным ключом РЕКОМЕНДУЕТСЯ называть
id
- Столбцы ссылающиеся на первичные ключи РЕКОМЕНДУЕТСЯ называть в формате [сущность в единственном числе]_[название столбца с первичным ключом]. Пример: для первичного ключа
customers.id
используем внешний ключcustomer_id
- Если родительская сущность совпадает с текущей (рекурсивная связь, например дерево категорий) РЕКОМЕНДУЕТСЯ использовать префикс
parent_
. Пример:categories.parent_id
- Если родительская сущность совпадает с текущей (рекурсивная связь, например дерево категорий) РЕКОМЕНДУЕТСЯ использовать префикс
- Названия столбов НЕ ДОЛЖНЫ содержать в себе названия текущей таблицы. Пример в таблице
products
поле "тип" не должно называтьсяproducts.product_type
. Правильный вариант:products.type
- Для разных таблиц РЕКОМЕНДУЕТСЯ использовать одинаковые слова для обозначения одинаковых по смыслу столбцов. Пример: название во всех таблицах должно быть
name
, а неname
,title
,label
и т.д. - РЕКОМЕНДУЕТСЯ не использовать типовые названия для отличных по смыслу столбцов. Пример: не использовать
is_active
для других смыслов, кроме активности. Пример типовых названий см. ниже
Типовые названия столбцов
Поле | Комментарий |
---|---|
id | Идентификатор |
name | Название |
code | Символьный код сущности, обычно транслитерация названия |
description | Описание |
is_active | Итоговая активность сущности (для вывода на витрину, фиды и т.д.) |
type | Тип |
status | Статус |
payload | json с дополнительными данными |
url | Сылка на http ресурс |
price | Итоговая цена с учётом всех скидок |
cost | Цена до скидки |
created_at и updated_at | Поля по умолчанию в каждой таблице для хранения даты создания и обновления |
При необходимости можно использовать суффиксы к типовым названиям. Например: description_full
, name_public
Типы некоторых столбцов
Поле | Рекомендуемы тип | Комментарий | Laravel migration |
---|---|---|---|
id | bigserial primary key | рекомендуется именно big | $table->id(); который внутри уже сам вызывает $table->unsignedBigInteger('id'); |
внешний ключ | unsigned bigint | $table->unsignedBigInteger('client_id')->index(); | |
цена | bigint в копейках | $table->bigInteger('price'); | |
перечисление (enum) | varchar(255) | $table->string('type'); | |
Временные метки (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
- тип индекса/ограничения:
pkey
- первичный ключ;foreign
- внешний ключ;unique
- уникальный индекс;index
- неуникальный индекс;
Например, для таблицы public.refunds
и столбца code
получаем уникальный индекс refunds_code_unique
В отличие от некоторых других систем управления базами данных, PostgreSQL по умолчанию автоматически не создает индексы для внешних ключей. Это означает, что вам необходимо явно создавать индексы для этих ключевых столбцов для повышения производительности запросов.
Представления (View)
- В названии представления необходимо использовать префикс
v_
- В названии материализованного представления необходимо использовать префикс
mv_
Хранимые процедуры, функции и триггеры
- В названии хранимых процедур необходимо использовать префикс
sp_
- В названии функций необходимо использовать префикс
fn_
- В названии триггеров необходимо использовать префикс
tr_
и суффикс условия срабатывания триггера (insert
,update
,delete
)
Не рекомендовано к использованию для реализации бизнес-логики
- Пользовательские типы
- Курсоры
- Триггеры
- Хранимые процедуры
- Функции