Есть ли хороший способ реализовать отношение «многие ко многим» между строками в одной таблице?
Пример: таблица для хранения синонимов слов:
-- list of words
CREATE TABLE word (
id integer PRIMARY KEY,
word varchar(32) NOT NULL UNIQUE
);
INSERT INTO words (id, word) VALUES (1, 'revolve');
INSERT INTO words (id, word) VALUES (2, 'rotate');
-- M:M link between words
CREATE TABLE word_link (
word1 integer REFERENCES word(id) NOT NULL,
word2 integer REFERENCES word(id) NOT NULL,
PRIMARY KEY (word1, word2)
);
Очевидное решение приводит, вероятно, к таблице not-1NF, содержащей повторяющиеся данные:
INSERT INTO word_link(word1, word2) VALUES (1, 2);
INSERT INTO word_link(word1, word2) VALUES (2, 1);
Хотя дублирование можно устранить путем добавления проверки (word1
Так есть ли лучший (и, надеюсь, распространенный) способ реализации такого отношения M: M?