Не требуется, чтобы у вас был первичный ключ.
Однако также не требуется, чтобы первичным ключом было только одно поле. В этом случае вы можете объявить свой первичный ключ как (tag_id, image_id).
У вас есть вопрос в ответ на другой пост, который подсказывает мне, что, возможно, вы думаете, что вам следует объединить два поля, чтобы получить первичный ключ. Не. Определите ключ как
alter table link add primary key (tag_id, image_id);
НЕ говори
alter table link add primary key (tag_id + image_id);
(Я думаю, что "+" - это оператор конкатенации в MySQL. Это было давно. Стандарт SQL - "&", но MySQL использует это для чего-то другого.)
Существует большая разница между ними, а именно, в первом случае 25,34 и 253,4 являются двумя разными значениями, а во втором случае оба они превращаются в 2534.
Будете ли вы всегда переходить от тега к изображению или также хотите переходить от изображения к тегу? Если вам нужно идти в обоих направлениях, то вы должны создать два индекса или первичный ключ и индекс с полями в обоих направлениях. Как:
create index link_tag_image on link(tag_id, image_id);
create index link_image_tag on link(image_id, tag_id);
Если вы делаете только первый (например), тогда рассмотрите этот запрос:
select tag.name
from image
join link on image.image_id=link.imagae_id
join tag on tag.tag_id=link.tag_id
where image.foo='bar'
Это выглядит достаточно правдоподобно: найдите все теги, которые соответствуют изображениям, которые соответствуют определенному условию. Но без второго индекса этот запрос может занять очень много времени, потому что БД придется последовательно читать всю таблицу ссылок, чтобы найти все записи с данным image_id.