Задать вопрос
@Filarru

Как правильно составить запрос на создание промежуточной таблицы многие-ко-многим?

Здравствуйте!

Есть две таблицы "магазин" и "товар". У них есть свои неключевые поля.

CREATE TABLE STORE (
store_ID INT NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
PRIMARY KEY (store_ID )
);

CREATE TABLE ITEM (
item_ID INT NOT NULL AUTO_INCREMENT,
name varchar(100) NOT NULL,
PRIMARY KEY (item_ID)
);


Много разных магазинов и много разных товаров.
Это дает третью таблицу для реализации связи "многие-ко-многим".

НО! Не ясно, как именно должен выглядеть запрос при создании такой таблицы.
У меня написано два варианта:

CREATE TABLE STORE_ITEM (
store_ID INT NOT NULL,
item_ID INT NOT NULL,
PRIMARY KEY (store_ID, item_ID)
FOREIGN KEY (store_ID) REFERENCES STORE(store_ID)
FOREIGN KEY (item_ID) REFERENCES ITEM(item_ID)
);

или

CREATE TABLE STORE_ITEM (
store_item_ID INT NOT NULL AUTO_INCREMENT,
store_ID INT NOT NULL,
item_ID INT NOT NULL,
PRIMARY KEY (store_item_ID, store_ID , item_ID)
FOREIGN KEY (store_ID) REFERENCES STORE(store_ID)
FOREIGN KEY (item_ID) REFERENCES ITEM(item_ID)
);


ВОПРОСЫ:
1. Какой вариант и в каком случае должен применяться?
2. Первый вариант подходит для промежуточной таблицы, а второй для самостоятельной сущности где могут быть свои неключевые поля?
3. Приемлемо ли для сущности-потомка все поля foreign keys указывать точно так, как они указаны у родителя или лучше добавлять префикс? Например, для третьей таблицы из примеров: store_ID или store_item_store_ID?
  • Вопрос задан
  • 142 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Если сочетание (store_ID, item_ID) уникально, то достаточно первого варианта
Если нет, то второй, только вот без этого извращения PRIMARY KEY (store_item_ID, store_ID , item_ID), зачем тут оно? достаточно просто PRIMARY KEY(store_item_ID)
Ну и по названиям, достаточно во всех таблицах первичный ключ назвать просто ID, а не store_ID, item_ID и извращений уровня store_item_ID
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы