【问题标题】:representing graph using relational database使用关系数据库表示图
【发布时间】:2010-06-03 18:57:31
【问题描述】:

我需要用关系数据库来表示图信息。

假设 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:有没有什么通用的方法可以用关系型数据库来表示图结构?

【问题讨论】:

  • 你需要做什么样的查询?这可能会改变您存储它们的方式...
  • “数据库”实际上是指“关系数据库”吗?如果没有,Graph Database 将是显而易见的选择。

标签: database graph


【解决方案1】:

Q1 : 有没有办法在 [database] 表中表示变量元素?

我猜你的意思是这样的?

 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

如果您的图表是无向的,您有两种选择:

  • 存储两个方向(即存储 1->2 和 2->1)
  • 使用 nodeid_from 必须小于 nodeid_to 的约束(即存储 1->2 但隐含 2->1)。

前者需要两倍的存储空间,但可以使查询更轻松快捷。

【讨论】:

    【解决方案2】:

    除了 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
    

    编辑:如果您要大量更新树,这不是最佳解决方案,因为必须重新编号整棵树

    【讨论】:

    • 树与有向图或无向图有点不同,但如果您需要树,这是一个很好的参考。
    【解决方案3】:

    我在图形结构的关系表示中存储了多个“TO”节点。我能够做到这一点是因为我的图表是定向的。这意味着如果我想知道“A”连接到哪些节点,我只需要从我的连接表中选择一条记录。我将 TO 节点存储在一个易于解析的字符串中,它工作得很好,有一个类可以管理从字符串到集合的转换以及返回。

    【讨论】:

      【解决方案4】:

      我建议按照 nawroth 的建议查看专用的图形数据库。一个例子是“Trinity”数据库,它适用于非常大的数据集。但是还有其他的。

      收听podcast by Scott Hanselman on Hanselminutes about Trinity。这是text transcript.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 2018-02-01
        • 2010-12-20
        • 2010-09-06
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        相关资源
        最近更新 更多