【问题标题】:Geting entities by id/key without specifying the ancestor key通过 id/key 获取实体而不指定祖先键
【发布时间】:2016-01-01 00:18:10
【问题描述】:

我将 go 与应用引擎和数据存储一起使用。我有餐厅和业主实体。 Owner 是 Restaurant 的父级。我在主页上显示餐厅列表。当访客点击餐厅时,个人资料页面(www.../restaurants/:id)将打开。那时我没有祖先密钥。我应该如何找回餐厅?我可以使用 /restaurants/:key 但 datastore.key 是很长的字符串。 这样做的自然方式是什么?我应该使用唯一的餐厅名称并以此进行查询/过滤吗?

【问题讨论】:

  • 为什么所有者有祖先,而是使用关系。即餐厅的所有者 = KeyProperty()。您是否使用涉及业主和餐厅的事务组?通常人们过度使用祖先财产以获得拥有的关系,然后遭受不利影响。例如,如果您的餐厅更改了它的所有者,您必须使用新的父级重新创建餐厅。如果您访问餐厅并不总是涉及所有者,那么您就有问题了。以拥有者为祖先,目前有什么好处?
  • KeyProperty 是 Python 中的一个术语吗?我用围棋。所以,我使用 Ancestor 是因为当我删除所有者时,我可能想删除它下面的餐馆,然后删除餐馆下面的菜单等等。听起来我需要交易。我不知道如何以聪明的方式做到这一点。但是你的意思是我在餐厅下添加一个字符串字段并将它的值设置为所有者的键值吗?如果是这样,我可以做到。
  • KeyProperty 与 go 中的Datastore key 相同。即使您使用祖先,也没有级联删除。所以你必须执行一系列查询和删除。是的,单笔交易可能是合适的,但您有 XG 交易,所以这没什么大不了的。当您不知道父母而没有查询时,与偶尔删除所有者相比,是否值得将您最常见的寻找餐厅的要求复杂化?那是你决定的事情。查看所有一般用例并设计数据模型以有效支持最常见的用例。

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


【解决方案1】:

您可以保留当前的数据模型(餐厅所有者的子实体)。您只需将“Owner”变量添加到餐厅即可。

当您检索餐厅实体时,您可以从其密钥中提取所有者 ID - 每个密钥都已包含一个父密钥(如果有)。在 Java 中它看起来像这样:

restaurant.setOwner(entity.getParent().getId());

当您需要获取/保存餐厅实体时,您可以使用其自己的标识符和使用所有者 ID 创建的父密钥来创建其完整密钥。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多