【问题标题】:Is it practical to store unique paths through a directed acyclic graph?通过有向无环图存储唯一路径是否可行?
【发布时间】:2013-12-07 02:32:41
【问题描述】:

客户端有一个存储为简单 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...)

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

  A
 / \
B   C
 \ /
  D

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

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

除了为每个证书引用每个路径中的每个顶点之外,还有更好的方法来存储这些路径吗?

【问题讨论】:

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


    【解决方案1】:

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

    如果我理解正确,您寻求的设计可以防止您将所有顶点存储为单个属性('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 为空。

    【讨论】:

    • 是的。当我意识到路径存储中会有多少冗余时,我最终沿着这些思路思考。你已经很好地结晶了,谢谢。
    猜你喜欢
    • 2016-09-25
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2012-03-17
    相关资源
    最近更新 更多