Нужна ли колонка amount в соединительнoй таблице многие-ко-многим?

Есть соединительная таблица (user_id, item_id), без primary key, так как у пользователя может быть много единиц одного вида item_id.

Правильно ли это? Или лучше сделать композитный ключ (user_id, item_id), но добавить колонку amount, для записи количества данного предмета?


Ответы (2 шт):

Автор решения: Anatoly

Если у вас в структуре используются суррогатные ключи, то само то, это сделать:

(id, user_id, item_id, amount)

где id - первичный ключ, генерируемый базой. Это классическая таблица для связей M:N. Я настоятельно не рекомендую создавать таблицы без первичного ключа.

→ Ссылка
Автор решения: 0xdb

Да, лучше добавить колонку 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)
/

→ Ссылка