使用关系数据库表示图形

时间:2010-06-03 18:57:31

标签: database graph

我需要用关系数据库表示图形信息。

假设a与b,c和d相连。

a -- b
|_ c
|_ d

我可以有a,b,c和d的节点表,我也可以有一个链接表(FROM,TO) - > (a,b),(a,c),(a,d)。 对于其他实现,可能有一种方法将链接信息存储为(a,b,c,d),但表中的元素数量是可变的。

  • Q1:有没有办法在表格中表示变量元素?
  • Q2:是否有使用关系数据库表示图结构的一般方法?

4 个答案:

答案 0 :(得分:31)

  

Q1:有没有办法在[数据库]表中表示变量元素?

我认为你的意思是这样的?

 from | to_1 | to_2 | to_3 | to_4 | to_5 | etc...
 1    | 2    | 3    | 4    | NULL | NULL | etc...

这不是一个好主意。它违反了first normal form

  

Q2:有没有使用数据库表示图结构的一般方法?

对于有向图,您可以使用包含两列的表edges

nodeid_from nodeid_to
1           2
1           3
1           4

如果有关于每个节点的任何额外信息(例如节点名称),则可以将其存储在另一个表nodes中。

如果你的图表是无向的,你有两个选择:

  • 存储两个方向(即商店1-> 2和2-> 1)
  • 使用nodeid_from必须小于nodeid_to的约束(即商店1> 2,但隐含2> 1)。

前者需要两倍的存储空间,但可以使查询更容易,更快。

答案 1 :(得分:3)

除了Mark提到的两个表路线外,还要看看以下链接:

http://articles.sitepoint.com/article/hierarchical-data-database/2

本文基本上预先指定树中分配左右值的元素。然后,您可以使用单个select语句选择树的部分或全部。

Node | lft | rght
-----------------
  A  |  0  |  7
  B  |  1  |  2
  C  |  3  |  4
  D  |  5  |  6

编辑:如果您要更新树,这不是最佳解决方案,因为整个树必须重新编号

答案 2 :(得分:1)

我在图结构的关系表示中存储了多个“TO”节点。我能够做到这一点,因为我的图表是针对性的。这意味着如果我想知道“A”连接到哪个节点,我只需要从我的连接表中选择一条记录。我将TO节点存储在一个易于解析的字符串中,它运行得很好,有一个类可以管理从字符串到集合和返回的转换。

答案 3 :(得分:0)

我推荐查看专用图表数据库,正如nawroth建议的那样。一个例子是“Trinity”数据库,适用于非常大的数据集。但还有其他人。

收听podcast by Scott Hanselman on Hanselminutes about Trinity。这是text transcript.