Вы можете уменьшить UNIQUE KEY
до item1_id
.Это означает, что таблица определяет отношение 1:1
, а не 1:n
.Кроме того, вы можете удалить первичный ключ auto_increment
, он не нужен в этих таблицах «ссылок»:
CREATE TABLE IF NOT EXISTS links (
item1_id int(20) NOT NULL,
item2_id int(20) NOT NULL,
PRIMARY KEY (item1_id),
FOREIGN KEY (item1_id) --- I assume you have these 2
REFERENCES item (item_id), --- Foreign Keys, too
FOREIGN KEY (item2_id)
REFERENCES item (item_id)
) ENGINE=InnoDB;
Разница между ответом этого и @ gbn состоит в том, что это не допускает пустых значений и ненужно, чтобы сохранить элемент, который не связан.Оба дизайна работают почти одинаково, с незначительными изменениями в операторах Insert / Delete / Update.
Однако в обоих проектах мы можем иметь связанные пары, такие как: (1 -> 2)
, (2 -> 3)
, (3 -> 7)
.Если это соответствует требуемой спецификации, оба дизайна хороши.
Если, однако, мы хотим, чтобы элементы отображались только в одной связанной паре, по обе стороны от ссылки сложнее реализовать.
Одним из способов было бы убедиться, что все вставки в таблице links
выполняются с помощью процедуры, которая либо вставляет пары (1, 2)
и (2, 1)
, либо завершается ошибкой (и аналогично для операторов Delete / Update, которые будутприходится иметь дело с 2 рядами).
Другие более сложные способы включают в себя триггеры (или экзотические структуры, такие как представления индексов, недоступные в MySQL).
Если вам нужен нормализованный дизайн, есть и такой подход (сложный, но без триггеров).):
CREATE TABLE IF NOT EXISTS link_help (
item1_id int(20) NOT NULL,
item2_id int(20) NOT NULL,
PRIMARY KEY (item1_id),
FOREIGN KEY (item1_id)
REFERENCES item (item_id),
FOREIGN KEY (item2_id)
REFERENCES item (item_id),
UNIQUE KEY (item1_id, item2_id) --- this will be needed below
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS links (
item1_id int(20) NOT NULL,
item2_id int(20) NOT NULL,
PRIMARY KEY (item1_id),
FOREIGN KEY (item1_id, item2_id)
REFERENCES link_help (item1_id, item2_id),
FOREIGN KEY (item2_id, item1_id) --- notice the different
REFERENCES link_help (item1_id, item2_id) --- order here
) ENGINE=InnoDB;
Теперь вы не можете добавлять (1 -> 2)
, (2 -> 3)
, (3 -> 7)
строк в таблицу links
.