2013-09-24 40 views
2

我有以下問題,我想知道是否有可能在本機SQL中解決它。假設我有一個無向圖,其中不得包含2個節點之間的多條邊。MySQL - 無向圖表示

我想在數據庫表中表示它,以下方案和內容:

ID|Node1|Node2| 
    --------------- 
    1 | A | B | 
    2 | B | C | 
    3 | D | E | 
    4 | F | D | 

我想建立在MySQL數據庫水平防止約束,我可以在下面的記錄添加到上表

5 | B | A | 

是否有人知道在MySQL的任何解決方案?

在此先感謝!

+0

您是否考慮過使用像[Neo4j](http://www.neo4j.org/)這樣的圖形數據庫? – Philipp

回答

0

如果MySQL支持CHECK約束,你可以簡單地說:

CREATE TABLE Edge (
    Node1 VARCHAR(50), 
    Node2 VARCHAR(50), 
    Direction ENUM('forward', 'backward'), 
    PRIMARY KEY (Node1, Node2), 
    INDEX (Node1, Node2), 
    CHECK (Node1 <= Node2) -- Use < if you don't want self-referencing. 
); 

INSERT INTO Edge VALUES 
    ('A', 'B', 'forward'), 
    ('B', 'C', 'forward'), 
    ('D', 'E', 'forward'), 
    ('D', 'F', 'backward'); 

[SQL Fiddle]

然後,你得到的主鍵衝突,如果你嘗試:

INSERT INTO Edge VALUES ('A', 'B', 'backward'); 

不幸的是,MySQL將允許...

INSERT INTO Edge VALUES ('B', 'A', 'forward'); 

...儘管CHECK約束,所以您必須在觸發器或應用程序邏輯中防止出現這種情況。

+0

因爲他希望兩個有一個** un **有向圖,所以不需要向後移動 – unique2

+0

如果MySQL忽略它,「CHECK」有什麼作用? – unique2

+0

@ unique2顯然,我誤解爲「無向」,因此「方向」可以被忽略。至於CHECK - 它顯示了這個概念。 OP可能會選擇堅持使用MySQL並在程序上實現該概念(如答案中所暗示的),或者選擇一個不同的DBMS,其中概念可以以聲明方式實現。 –

0

你確定'排序'的節點名稱?也就是說,Node1的值保證小於Node2。

例如,對(C,A)是保證被寫爲:(A,C)

您的代碼應照顧這;你可以用min/max來處理它。