META

Именование сущностей в БД

При разработке новой БД предлагается придерживаться следующих правил. При этом, если у вас есть готовая БД, то вы не должны хотеть полностью переделать ее соглашения, так как это бесполезная работа. Просто продолжайте использовать то, что у вас есть.

  • Все таблицы должны иметь несоставной первичный ключ, который должен называться 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();