使用关系型数据库表示图形

19

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

比如说,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:是否有任何通用的方法来使用关系型数据库表示图形结构?

3
你需要执行哪种类型的查询?这可能会改变你存储它们的方式... - Aryabhatta
4
“数据库”这个词是否实际指的是“关系型数据库”?如果不是的话,那么选择图形数据库将是显而易见的选择。 - nawroth
4个回答

33

问题1:有没有一种方法可以在[数据库]表中表示可变元素?

我猜你是指这样的情况吗?

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

这不是一个好主意,它违反了第一范式

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是暗示的)。
前者需要两倍的存储空间,但可以使查询更加简单快速。

2
除了Mark提到的两个表路线之外,请查看以下链接:

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

该文章基本上对树中的元素进行预排序,分配左右值。然后,您可以使用单个选择语句选择部分或整个树。
Node | lft | rght
-----------------
  A  |  0  |  7
  B  |  1  |  2
  C  |  3  |  4
  D  |  5  |  6

编辑:如果您将大量更新树,则此方法不是最佳解决方案,因为整个树必须重新编号。


4
树与有向或无向图有些不同,但如果您需要了解树的话,这是一个很好的参考。 - JR Lawhorne

1
我在图结构的关系表示中存储了多个“TO”节点。我之所以能够这样做,是因为我的图是有向的。这意味着如果我想知道节点“A”连接到哪些节点,我只需要从我的连接表中选择一条记录即可。我将TO节点存储在易于解析的字符串中,并且它非常有效,使用一个类来管理从字符串到集合的转换。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接