Как обеспечить, чтобы отношения «многие ко многим» имели один и тот же внешний ключ

#mysql #sql #rdbms

#mysql #sql #rdbms

Вопрос:

введите описание изображения здесь

Как я могу гарантировать, что таблица shop_has_product принадлежит той же компании? Есть ли способ добиться этого с помощью СУБД или мне нужно написать логику вставки на прикладном уровне.

Спасибо вам за ваше время.

Ответ №1:

В MySQL вы можете создать ссылку на внешний ключ на любой КЛЮЧ таблицы, на которую ссылается ссылка, а не только на первичный ключ. Поэтому создайте КЛЮЧ поверх id с company_id в каждой таблице.

 CREATE TABLE company (
 id INT PRIMARY KEY,
 name VARCHAR(45)
);

CREATE TABLE product (
 id INT PRIMARY KEY,
 company_id INT NOT NULL,
 KEY (id, company_id),
 FOREIGN KEY (company_id) REFERENCES company(id)
);
    
CREATE TABLE shop (
 id INT PRIMARY KEY,
 name VARCHAR(45),
 company_id INT NOT NULL,
 KEY (id, company_id),
 FOREIGN KEY (company_id) REFERENCES company(id)
);
  

Затем добавьте company_id столбец в таблицу «многие ко многим» и используйте один и тот же столбец в двух внешних ключах, по одному для каждой из вышеупомянутых таблиц. Естественно, company_id оба внешних ключа в данной строке должны иметь одинаковое значение.

  CREATE TABLE shop_has_product (
 shop_id INT NOT NULL,
 product_id INT NOT NULL,
 company_id INT NOT NULL,
 PRIMARY KEY (shop_id, product_id),
 FOREIGN KEY (shop_id, company_id) REFERENCES shop(id, company_id),
 FOREIGN KEY (product_id, company_id) REFERENCES product(id, company_id)
);