我需要用关系数据库表示图形信息。
假设a与b,c和d相连。
a -- b |_ c |_ d
我可以有a,b,c和d的节点表,我也可以有一个链接表(FROM,TO) - > (a,b),(a,c),(a,d)。 对于其他实现,可能有一种方法将链接信息存储为(a,b,c,d),但表中的元素数量是可变的。
答案 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
中。
如果你的图表是无向的,你有两个选择:
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.