我需要使用关系型数据库来表示图形信息。
比如说,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:是否有任何通用的方法来使用关系型数据库表示图形结构?
我需要使用关系型数据库来表示图形信息。
比如说,a与b、c和d相连
a -- b |_ c |_ d
我可以为a、b、c和d分别建立一个节点表,还可以建立一张链接表(FROM, TO) -> (a,b), (a,c), (a,d)。对于其他实现,可能存在将链接信息存储为(a,b,c,d)的方法,但表中元素数量是可变的。
问题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
的表中。nodeid_from
必须小于 nodeid_to
(即存储1->2,但2->1是暗示的)。http://articles.sitepoint.com/article/hierarchical-data-database/2
该文章基本上对树中的元素进行预排序,分配左右值。然后,您可以使用单个选择语句选择部分或整个树。Node | lft | rght
-----------------
A | 0 | 7
B | 1 | 2
C | 3 | 4
D | 5 | 6
编辑:如果您将大量更新树,则此方法不是最佳解决方案,因为整个树必须重新编号。
我建议看一下专门的图形数据库,就像nawroth所建议的那样。其中一个例子是适用于非常大型数据集的“Trinity”数据库。但还有其他选择。