Нужна ли колонка amount в соединительнoй таблице многие-ко-многим?
Есть соединительная таблица (user_id, item_id), без primary key, так как у пользователя может быть много единиц одного вида item_id.
Правильно ли это? Или лучше сделать композитный ключ (user_id, item_id), но добавить колонку amount, для записи количества данного предмета?
Ответы (2 шт):
Если у вас в структуре используются суррогатные ключи, то само то, это сделать:
(id, user_id, item_id, amount)
где id - первичный ключ, генерируемый базой. Это классическая таблица для связей M:N. Я настоятельно не рекомендую создавать таблицы без первичного ключа.
Да, лучше добавить колонку amount и сделать композитный первичный ключ:
create table useritems (
user_id int references users (id),
item_id int references items (id), amount int,
constraint pk_useritems primary key (user_id, item_id))
/
Если приложение делает подобные запросы - кол-во предмета у всех пользователей:
select count (amount) totalitems
from useritems
where item_id = ?
/
То композитный индекс не поможет, так как его первая колонка user_id не используется.
Добавте просто ещё один дополнительный индекс:
create index ix_useritems on useritems (item_id)
/