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

有帮助吗?

解决方案

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

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

其他提示

嗯,您应该尽量保持数据的线性。如果您需要快速查询数据的树结构,您可能必须将其存储在数据库中(或者如果您愿意,可以使用JSON编码),如果这对您的数据是可能的,或者您必须生成可以生成的树索引用于快速查询树结构的一部分。但是,我不确定Google App Engine在更新这些索引时的表现如何。

对于Google App Engine,您的主要关注点应该是减少需要进行的查询次数,并确保查询尽可能少地返回。操作很昂贵,但存储不是,所以冗余不应该被视为坏事。

以下是我通过谷歌搜索找到的主题的一些想法(虽然对于MySQL,但你可以从中得到一般的想法):在MySQL中管理分层数据

啊,这是Google App Engine的讨论:建模分层数据

一种方法是使用Model的父属性。然后,您可以使用query.ancestor()和model.parent()函数。

我想这取决于你想对这些数据做什么样的操作,这将决定如何最好地表示它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top