Все сущности в системе должны иметь суррогатный, то есть, искусственный идентификатор. Например, автоинкрементный целочисленный. Такой идентификатор должен быть даже в том случае, если сущность имеет естественный идентификатор.
Например, сущность "Категория товара" может иметь естественный идентификатор, созданный на основе названия категории. Для неё всё равно заводится суррогатный идентификатор.
Пример таблицы:
CREATE TABLE categories
(
id bigserial PRIMARY KEY, -- Суррогатный идентификатор
code character varying, -- Системное уникальное название категории
name character varying -- Название категории, отображаемое на клиенте
);
CREATE UNIQUE INDEX index_categories_on_code
ON categories
(code);Любые поля в таблицах, которые являются ссылками на строки в другой таблице, должны быть проиндексированы. В случае составных индексов это поле должно находиться на первом месте. Например, если в таблице вариантов товара хранится идентификатор товара, то это поле должно быть проиндексировано:
CREATE TABLE products
(
id bigserial PRIMARY KEY,
name character varying
);
CREATE TABLE variants
(
id bigserial PRIMARY KEY,
product_id bigint
);
CREATE INDEX index_variants_on_product_id
ON variants
(product_id);Любая таблица - это хранилище множества строк. Логичным решением будет называть таблицы во множественном числе. Например, таблицу пользователей назвать users.
Для промежуточных таблиц название составляется из названий тех сущностей, которые она связывает. Например, для связи пользователей и ролей название таблицы будет user_roles.
При именовании полей не дублируйте название сущности в названии поля, так как эта информация не несет никакого смысла.
Пример плохих именований:
CREATE TABLE cities
(
city_id bigserial PRIMARY KEY,
city_name character varying
);Пример хороших именований:
CREATE TABLE cities
(
id bigserial PRIMARY KEY,
name character varying
);