通过有向无环图存储唯一路径是否可行?

时间:2013-12-06 16:08:03

标签: database graph data-modeling directed-acyclic-graphs

客户端有一个可组合对象的数据库,存储为一个简单的DAG。

item (id, info...)
link (parent_id, child_id)

对于过时的(以及不幸的是不可协商的)认证目的,他们现在想要为源和顶点的每个组合存储附加信息。例如对于作文

  A
  |
  B
 / \
C   D

他们需要证书(A,B)证书(A,C)和证书(A,D)。容易吗?

cert(parent_id, child_id, info...)

现在问题是这些证书应该是针对每个路径而不是每个节点。所以对于有共同祖先的物品

  A
 / \
B   C
 \ /
  D

我们需要证书(A,B),(A,C)(A,D)[来自B]和(A,D)[来自C]

我想不出一种存储这些证书的方法,这些证书不涉及在它所代表的路径中存储对每个顶点的引用,但这似乎是惊人的指数。有成千上万的记录,如果一些图表只包含一些共同的祖先,事情可能会快速失控。

是否有更好的方法来存储这些路径,而不仅仅是引用每个证书的每个路径中的每个顶点?

1 个答案:

答案 0 :(得分:2)

如果需要存储路径,您肯定会拥有与路径一样多的记录。没办法在这里。

如果我理解正确,您会寻求一种设计,阻止您将所有顶点存储为单个属性('A,B,D')或单独的表。

在这种情况下,采用分层方法:

path_id  segment_id  next_vertex      -- which path it represents
1                    A
2                    B
3                    C
4                    D
5         1          B                 -- A B
6         1          C                 -- A C
7         2          D                 -- B D
8         3          D                 -- C D
9         5          D                 -- A B D
10        6          D                 -- A C D

这里segment_id表示没有最后一个顶点的子路径。现在,例如,路径10表示“A-> C-> D”,其由“A-> C”(路径6)组成,其末端添加了顶点D.您可以通过同样的方式遍历树来遍历层次结构。

注意我们这里也有'退化路径',只包含一个顶点,其中segment_id为空。