【问题标题】:How to change ancestor of an NDB record?如何更改 NDB 记录的祖先?
【发布时间】:2012-08-07 21:04:54
【问题描述】:

在高复制数据存储(我使用 NDB)中,一致性是最终的。为了获得有保证的完整集,可以使用祖先查询。祖先查询还提供了一种很好的方法,可以通过 kindless 查询获取特定祖先的所有“孩子”。简而言之,能够利用祖先模型在 GAE 中非常有用。

我似乎遇到的问题相当简单。假设我有一个联系人记录和一个消息记录。给定的联系人记录被视为每条消息的祖先。但是,可能会为同一个人创建两个联系人(用户错误、不同的数据点等)。这种情况会产生两个联系人记录,其中包含与之相关的消息。

我需要能够“合并”两条记录,并将所有消息放入一大堆。理想情况下,我可以修改记录的其中一个子项的祖先。

我能想到的唯一方法是创建一个映射并让我的应用程序检查记录是否已合并。如果有,请查看映射以找到一个或多个相关记录,并对这些记录执行查询。这似乎非常低效。是否有更多“按书本”的方式来处理这个用例?

【问题讨论】:

  • 对我来说听起来这取决于您的数据模型的外观。您如何决定是否必须合并 2 条记录?
  • 好问题 - 因为这是在思考阶段,让我们假设用户输入。
  • 因此,如果您想基于用户输入的特定字段(比如说邮件)进行合并,您首先查询数据存储区并查看是否已经存在包含该电子邮件的记录并从那里继续。如果应用程序是新的并且您还没有记录,那么我建议您根据电子邮件创建带有键名/id 的记录,以便能够通过 id 进行查询。
  • 您假设这可以在输入时被捕获,如果记录被用户修改怎么办。如果您尝试为通讯簿建模,这是一个常见问题。
  • 每当需要创建/更新记录时,您都需要检查它是否已经存在。用户修改与否。如果不是用户,还有谁可以修改记录?

标签: python google-app-engine google-cloud-datastore


【解决方案1】:

更改实体祖先的唯一方法是删除旧实体并使用新密钥创建新实体。必须对祖先路径中的所有子(和孙子等)实体执行此操作。如果这是不可能的,那么您列出的解决方案有效。

这是必需的,因为实体的祖先路径是其唯一键的一部分。实体的父级(即祖先路径中的实体)不需要存在,因此更改父级的键将使子级在数据存储中没有父级。

【讨论】:

  • 谢谢。我希望有一个更有效的解决方案,但这很有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
  • 2010-10-13
相关资源
最近更新 更多