在Google App Engine数据存储中存储分层数据?

Mat*_*mer 24 google-app-engine hierarchical-data google-cloud-datastore

有人可以说明我如何在谷歌应用引擎数据存储中存储和轻松查询分层数据?

Nic*_*son 21

最佳选择取决于您的要求.这里有一些解决方案(我假设你使用的是Python,因为你没有指定):

  1. 如果您需要在整个树上执行事务更新,并且您对任何一棵树的持续更新不会超过大约1QPS,则可以使用内置支持进行层次存储.创建实体时,可以传递"parent"属性以指定父实体或键,并且在查询时,可以使用.ancestor()方法(或GQL中的"ANCESTOR IS"来检索给定实体的所有后代) .
  2. 如果您不需要事务更新,则可以复制实体组的功能而不会出现争用问题(以及事务安全性):将db.ListProperty(db.Key)添加到名为"ancestors"的模型中,并使用要插入的对象的祖先列表.然后,您可以使用MyModel.all()过滤器('ancestors =',parent_key)轻松检索来自给定祖先的所有内容.
  3. 如果您不需要事务,并且只关心检索实体的直接子项(不是所有后代),请使用上面概述的方法,但是不要使用ListProperty而是使用ReferenceProperty到父实体.这被称为邻接列表.

还有其他方法,但这三种方法应涵盖最常见的情况.

  • 内置的祖先支持使用与2相同的技术 - 它在内部存储祖先列表.2的优点是您没有交易率限制.地方不是问题. (3认同)
  • 似乎(2)和(1)做同样的事,但(1)会便宜得多.令我感到震惊的是,在存储成本方面,密钥列表非常昂贵,随着树的深入,这种情况只会变得更糟.另外,(1)不会导致良好的地方? (2认同)