4

有没有一种好方法来实现单表中的行之间的多对多关系?

示例:存储单词同义词的表:

-- 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)
);

明显的解决方案导致可能不是 1NF 表,其中包含重复数据:

INSERT INTO word_link(word1, word2) VALUES (1, 2);
INSERT INTO word_link(word1, word2) VALUES (2, 1);

虽然可以通过添加 (word1 < word2) 检查来处理重复,但它使 SELECT 更加复杂(与普通连接相比,联合)并且非常随意。这种特定情况可以从辅助表中受益(例如“含义”,因此单词是 M:N 链接到共同含义而不是相互链接,从而提供更清晰的模式),但我对一些通用解决方案感兴趣。

那么有没有更好的(希望是通用的)方法来实现这种 M:M 关系?

4

2 回答 2

1

在这种情况下,我会在 UPDATE 和 INSERT 上添加一个 CHECK CONSTRAINT 以强制 word1 始终小于 word2,反之亦然。

于 2009-07-15T18:36:10.703 回答
0

我将创建一个如下视图:

select distinct
    case when word1 < word2 then word1 else word2 end as word1,
    case when word1 < word2 then word2 else word1 end as word2
from
    word_link

这样,您始终拥有一个干净、没有重复且易于选择的列表。我发现这与建立多对多关系的方式一样干净。

于 2009-07-15T18:34:36.727 回答