有人可以说明我如何在谷歌应用引擎数据存储中存储和轻松查询分层数据吗?
问问题
6920 次
3 回答
21
最佳选择取决于您的要求。这是一些解决方案(我假设您使用的是 Python,因为您没有指定):
- 如果您需要对整棵树进行事务更新,并且对任何一棵树的持续更新不会超过 1QPS,则可以使用对分层存储的内置支持。创建实体时,可以传递“parent”属性来指定父实体或键,查询时,可以使用 .ancestor() 方法(或 GQL 中的 'ANCESTOR IS' 来检索给定实体的所有后代.
- 如果您不需要事务更新,则可以复制实体组的功能而不会出现争用问题(和事务安全):将 db.ListProperty(db.Key) 添加到名为“ancestors”的模型中,并使用您要插入的对象的祖先列表。然后,您可以使用 MyModel.all().filter('ancestors =', parent_key) 轻松检索来自给定祖先的所有内容。
- 如果您不需要事务,并且只关心检索实体的直接子代(不是所有后代),请使用上述方法,但不要使用 ListProperty,只需使用父实体的 ReferenceProperty。这称为邻接列表。
还有其他可用的方法,但这三种方法应该涵盖最常见的情况。
于 2009-06-18T16:02:14.003 回答
3
好吧,你应该尽量保持你的数据尽可能线性。如果您需要快速查询数据的树形结构,则必须将其存储在数据库中(或者如果您愿意,可以使用 JSON 编码)(如果您的数据可能的话),或者您必须生成可以用于快速查询一片树结构。但是,我不确定 Google App Engine 在更新这些索引时会如何执行。
对于 Google App Engine,您主要关心的是减少您需要进行的查询数量,并且您的查询返回尽可能少的行。操作很昂贵,但存储不是,因此冗余不应被视为一件坏事。
以下是我通过谷歌搜索找到的关于该主题的一些想法(虽然是针对 MySQL,但您可以从中得到大致的想法):Managing Hierarchical Data in MySQL
啊,这是关于 Google App Engine 的讨论:Modeling Hierarchical Data
于 2009-06-18T09:57:06.610 回答
0
一种方法是使用模型的父属性。然后,您可以使用 query.ancestor() 和 model.parent() 函数。
我想这取决于您想对这些数据执行什么样的操作,这将决定如何最好地表示它。
于 2009-06-18T11:08:10.633 回答