MySQL - 无向图表示

时间:2013-09-24 06:50:35

标签: mysql sql database-design

我有以下问题,我想知道是否可以在本机SQL中解决它。 假设我有一个无向图,它不能在两个节点之间包含多个边。

我想在数据库表中表示它,例如以下方案和内容:

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

我想在MySQL中设置一个数据库级别的约束来防止,我可以将以下记录添加到上面的表中

    5 | B   | A   |

有人在MySQL中知道任何解决方案吗?

提前致谢!

2 个答案:

答案 0 :(得分: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]

然后,如果您尝试,则会收到PRIMARY KEY违规行为:

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

不幸的是,MySQL会允许......

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

...尽管存在CHECK约束,因此您必须在触发器或应用程序逻辑中防止这种情况。

答案 1 :(得分:0)

你可以'排序'节点名称吗?也就是说,保证Node1的值小于Node2。

例如,保证对(C,A)写为:(A,C)

你的代码应该照顾好这个;你可以用min / max来处理它。