【问题标题】:Hierarchical queries for Parent-Child entities in App EngineApp Engine 中父子实体的分层查询
【发布时间】:2014-06-02 07:21:09
【问题描述】:

是否可以在单个查询过程中查询父 + 子实体?

这需要在 SQL 中进行 JOIN,但在底层 BigTable 中,键是连续的,因此理论上应该可以一次扫描父实体和子实体。例如:

  • 父级 1
  • Parent-1-Child-A
  • Parent-1-Child-B
  • Parent-1-Child-C
  • 父 2
  • Parent-2-Child-D
  • 父 3
  • Parent-3-Child-E

祖先查询将范围限制为单个父项。我正在寻找的是不限于单一种类的按键范围查询。

【问题讨论】:

    标签: google-app-engine gql nosql


    【解决方案1】:

    默认情况下不存在类似的东西。

    我解决此问题的一种方法是让每个实体将所有可能的路径存储为重复属性,如果您希望它以祖先查询的方式在查询中返回,则包括其自身。另外存储直接父级的路径。

    即(我将包含一个超过 2 个级别的示例)

    Parent-1 
    paths = ['Parent-1']
    parent = []
    
    Parent-1-Child-A
    paths = ['Parent-1','Parent-1/Child-A']
    parent = ['Parent-1']
    
    Parent-1-Child-C
    paths = ['Parent-1','Parent-1/Child-C']
    parent = ['Parent-1']
    
    Parent-1-Child-C-Child-F
    paths = ['Parent-1','Parent-1/Child-C','Parent-1/Child-C/Child-F' ]
    parent = ['Parent-1/Child-C']
    
    Parent-1-Child-C-Child-E
    paths = ['Parent-1','Parent-1/Child-C','Parent-1/Child-C/Child-E' ]
    parent = ['Parent-1/Child-C']
    

    通过这种方式,您可以查询任何键范围并将深度限制为直接子级)祖先查询无法限制深度。

    这将要求您使用 PolyModel(您没有说您使用的是 python 还是 java - 我不知道 java 是否有 PolyModel 模拟)。因此,Parent 和 Child 将继承自基于 PolyModel 的 Node

    class Node(ndb.PolyModel):
      pass
    
    class Parent(Node):
      pass
    
    class Child(Node):
      pass
    

    虽然您可能不需要为父母和孩子设置不同的课程。

    需要注意的一点,如果您在键中使用祖先/父母,则如果不完全复制/重写所有孩子,您就无法重新排列您的层次结构

    【讨论】:

    • 感谢蒂姆,这是有道理的,尽管它确实强制使用单一的种类(或至少继承的种类)层次结构,这是我试图避免的。似乎是对 NDB 而不是底层数据存储的限制。
    • 实际上它是数据存储而不是ndb的限制。所有索引都是特定的。 datstore 支持的唯一一种较少的查询是祖先查询。
    • 蒂姆,我知道索引是特定的,但我的理解是底层的 BigTable 键空间不是——它是复合的(/a、/a/b、/a/b/c、/ b等)——因此应该可以进行有效的键范围扫描(不使用任何二级索引)。 developers.google.com/appengine/docs/python/ndb/entities 以根实体开始并从父实体到子实体的实体序列,通向给定实体,构成该实体的祖先路径。
    • 试试看。没有隐藏的语法。请注意 GQL 和数据存储 api 的限制。除了无种类的祖先查询外,没有跨种类查询的机制。正因为 BigTable 可能以某种方式构建,所以数据存储不是 BigTable,而是上一层。我想被证明是错误的。尝试降低一级并使用原始数据存储 API。我用了一点,还没有看到任何机制来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多