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

Posted

技术标签:

【中文标题】在 Google App Engine 数据存储中存储分层数据?【英文标题】:Storing hierarchical data in Google App Engine Datastore? 【发布时间】:2010-11-03 22:50:59 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

第 (2) 点回答了我的问题!谢谢。 似乎 (2) 和 (1) 的作用相同,但 (1) 会便宜得多。令我震惊的是,就存储成本而言,密钥列表非常昂贵,随着树的深入,这种情况只会变得更糟。另外,(1)不会导致良好的局部性吗? 内置祖先支持使用与 2 相同的技术 - 它在内部存储祖先列表。 2 的优点是您没有交易率限制。地点不是问题。 对于 (3),您可能想使用 SelfReferenceProperty 类型,因为父对象可能与 self 类型相同。【参考方案2】:

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

对于 Google App Engine,您的主要关注点应该是减少您需要进行的查询数量,并让您的查询返回尽可能少的行。操作很昂贵,但存储却不是,因此冗余不应被视为一件坏事。

以下是我通过谷歌搜索找到的关于该主题的一些想法(虽然是针对 mysql,但您可以从中得到大致的想法):Managing Hierarchical Data in MySQL

啊,这是关于 Google App Engine 的讨论:Modeling Hierarchical Data

【讨论】:

【参考方案3】:

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

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

【讨论】:

这不是一个好主意。实体组仅应在事务需要时使用。来自文档:“仅在事务需要时使用实体组。对于实体之间的其他关系,请使用 ReferenceProperty 属性和键值,它们可以在查询中使用。” 还请记住:实体的父级不能更改,但 ReferenceProperty 可以!

以上是关于在 Google App Engine 数据存储中存储分层数据?的主要内容,如果未能解决你的问题,请参考以下文章

Google App Engine - 哪些工具可以在本地编辑数据存储? [关闭]

在 Google App Engine 上的数据存储区中更新大量实体

如何从本地 Google App-engine 数据存储中删除所有实体?

您如何在 Java 中使用 Google App Engine 数据存储中的列表属性?

数据存储区中的 Google App Engine 版本控制

计算在 Google App Engine 数据存储区中计算分数和日期的索引