客户端有一个可组合对象的数据库,存储为一个简单的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]
我想不出一种存储这些证书的方法,这些证书不涉及在它所代表的路径中存储对每个顶点的引用,但这似乎是惊人的指数。有成千上万的记录,如果一些图表只包含一些共同的祖先,事情可能会快速失控。
是否有更好的方法来存储这些路径,而不仅仅是引用每个证书的每个路径中的每个顶点?
答案 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为空。