Google 数据存储删除和多个父项

Google Datastore deletes and multiple parents

我有一个数据模型,其中实体 A 包含对另外两个实体 BC 的引用。如果 BC 被删除,我希望 A 被删除。

创建 A 时,可以将 BC 命名为其父项。是否也可以将 both BC 命名为它的父级,这样如果 BC 被删除,A也被删除了?

更具体地说,比如搜索结果,一个结果可能同时包含 categoryregion,比如有关北美鸟类的网页。结果存储时会引用其类别和区域。稍后,您想要删除类别 birds 并且您希望结果也被删除。同样,您删除区域 North America 并希望删除结果。

我讨厌就这样一个微不足道的场景长篇大论。但它似乎没有包含在任何数据存储文档中。我错过了什么?它是一个基本上有缺陷的数据模型吗?

Single-parent限制:

一个 child 在 Datastore 中只能有一个 parent。换句话说,A 只能是 B C 的 child,而不是两者。当然,一个parent可以有多个children。

选择:

您可以使用带有 repeated=True 参数的 KeyProperty 并在其上存储许多实体键。在 Python 中,这将是这样的:

class A(ndb.Model):
    associated_with = ndb.KeyProperty(repeated=True)
    some_other_property = ndb.StringProperty()

a_entity = A(
    associated_with = [b_key, c_key],
    some_other_property = 'any value'
)
a_entity.put()

自动触发删除:

Datastore 不提供开箱即用的此功能,但您可以在您的应用程序中模仿它。在 Python 中实现的一个想法,例如,您可以使用自己的 delete 方法扩展模型 class(尚未测试此代码,仅用于说明):

class A(ndb.Model):
    associated_with = ndb.KeyProperty(repeated=True)
    some_other_property = ndb.StringProperty()

    def delete_ext(entity):  # entity object
        if entity.associated_with:
            for associated in entity.associated_with:
                associated.delete()
        entity.key.delete()

您可能希望将所有删除操作包装在一个事务中。请注意,单个事务最多可以对 25 个实体组进行操作。