2009-07-15 46 views
3

有沒有一種很好的方法來實現單表中的行之間的多對多關係?多對多的自引用表

實施例:表存儲字同義詞:

-- 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)檢查,它使SELECTs變得更加複雜(聯合比較瑣碎的聯接)並且非常隨意。這個特殊情況可以從輔助表中獲益(例如'含義',所以單詞M:N與常用含義聯繫在一起,而不是相互聯繫,給出更清晰的模式),但我對一些通用解決方案感興趣。

那麼是否有更好的(並希望是普通的)方法來實現這種M:M關係?

回答

1

在這種情況下,我會在UPDATE和INSERT上添加一個CHECK CONSTRAINT來強制word1總是小於word2,反之亦然。

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 

這樣,你總是有一個乾淨的,沒有重複的名單,很容易從中進行選擇。我發現這是一種乾淨的方式,因爲你必須做一個多對多的關係。

+0

ummm ...您的病例陳述對兩種病例都有相同的標準。我認爲你的意思是word2 2009-07-15 18:43:27