【问题标题】:Storing a directed graph in google appengine datastore在 google appengine 数据存储中存储有向图
【发布时间】:2009-07-27 10:13:46
【问题描述】:

我需要在 google appengine 中存储一个大型动态无向图,最好的方法是什么? 图表示必须能够支持快速拉出一组顶点(用于在页面上呈现)和来自特定顶点的所有链接,以及跨图的寻路(尽管实际上并不需要最佳路径,只是一个相当好一个)

我对这个问题的看法: 最明显的方法是拥有一个顶点模型和一个引用两个顶点的边缘模型,但是听起来它最终会为每个操作使用大量查询,我想知道是否有更好的方法(也许以某种方式将链接信息构建到每个顶点中)

【问题讨论】:

    标签: database-design google-app-engine path-finding directed-graph


    【解决方案1】:

    这是最简单的方法:

    class Vertex(db.Model):
      outedges = db.ListProperty(db.Key)
      # Other information about the vertex here
    

    现在您无需任何查询即可探索图形 - 只需在 1 个或多个键上调用 db.get 即可检索相关顶点:

    # Get the first referenced vertex
    vertex2 = db.get(vertex1.outedges[0])
    
    # Get all referenced vertices
    vertices = db.get(vertex1.outedges)
    

    【讨论】:

      【解决方案2】:

      根据顶点/链接的数量,您可能只想使用列表而不是创建一堆新实体。查看 Google IO 2009 视频后半部分描述的朋友图问题:http://www.youtube.com/watch?v=AgaL6NGpkB8

      如果您认为顶点的数量足够多,您可以创建一个带有表示连接的列表的 Vertex 模型。

      【讨论】:

        【解决方案3】:

        考虑到您使用的是 google 应用引擎,最好将信息存储在单独的表格中:

        一个用于顶点,一个用于来自顶点的链接(正如您已经说过的),另一个用于已经预先计算路径的链接。

        如果您存储的信息是非规范化的,则 GAE 效果最佳,因此您无需对其进行任何计算。

        【讨论】:

        • 问题是,图表是动态的,重新计算所有这些路径更改将花费我大量的配额
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        相关资源
        最近更新 更多