Именование сущностей в БД
При разработке новой БД предлагается придерживаться следующих правил. При этом, если у вас есть готовая БД, то вы не должны хотеть полностью переделать ее соглашения, так как это бесполезная работа. Просто продолжайте использовать то, что у вас есть.
- Все таблицы должны иметь несоставной первичный ключ, который должен называться id
- Все таблицы, представления, функции, триггерные функции и типы должны иметь комментарий
- Поля таблиц и view должны иметь комментарий. Исключения: поля с внешними ключами, общепонятные поля (первичный ключ, views, clicks, name, title и т.п.), enum-поля
- Последовательности (sequences) одних таблиц нельзя копировать для других, если это дейстивтельно не оправдано. Для новых таблиц используйте serial и bigserial как типы полей с первичным ключем
- Лучше, чтобы названия первичных, уникальных ключей, индексов должна выдавать БД при создании этих объектов - так мы сэкономим время на разбирательствах что и как должно называться, БД сама разберется как это называть.
- Параметры и переменные в хранимых процедурах должны начинаться с "_" чтобы не перепутать их с полями таблиц и пр.
- Все схемы, таблицы, предстваления, поля, функции, триггеры и пр. должны иметь нотацию lower_camelcase. По возможность избегайте использования зарезервированных имен типа user, domain, table и пр
Таблицы сущностей
Должны иметь свой PK, желательно id
Единственное число. Например client, entity, "user", campaign, company, ...
Таблицы связей
Должны иметь свой PK, желательно id
Один ко многим: единственое_множественное. Например: client_managers
Многие ко многим: client_manager, client_manager_link
Дата время (без TZ)
Постфикс "_time"
Например: creation_time, modification_time
Только дата
Если не предполагается хранить время, то поле обязательно должно иметь тип DATE, т.е. не содержать никаких меток времени и не должно быть сохранено в формате unix timestamp. Постфикс "_date"
Например: creation_date
Последний редактировавший пользователь
Почти всегда нужен, чтобы триггеры могли писать логи
Например: last_user_id
DDL
CREATE TABLE my_table (
id text primary key,
name text NOT NULL,
creation_time timestamptz NOT NULL DEFAULT NOW(),
modification_time timestamptz NOT NULL DEFAULT NOW(),
last_user_id bigint NOT NULL
);
CREATE TRIGGER update_modification_time_my_table
BEFORE UPDATE
ON public.my_table
FOR EACH ROW
EXECUTE PROCEDURE public.update_modification_time();