Google数据存储区删除多个父级

时间:2017-04-14 19:03:02

标签: google-cloud-datastore data-modeling

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

创建A时,可以将BC命名为其父级。是否也可以将 BC命名为其父级,以便删除BC,{{1} }也被删除了?

更具体地说,比如说搜索结果,结果可能同时包含Acategory,比如北美的鸟类网页。结果存储时引用其类别和区域。稍后,您要删除类别region,并且您希望删除结果。同样,您删除区域birds并希望删除结果。

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

1 个答案:

答案 0 :(得分:2)

单亲限制:

一个孩子在Datastore中只能拥有一个父级。换句话说,A只能是B C的孩子,而不是两者。当然,父母可以有多个孩子。

替代:

您可以使用带有KeyProperty参数的repeated=True并在其上存储许多实体密钥。在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()

自动触发删除:

数据存储区不提供开箱即用的此功能,但您可以在应用程序中模仿它。例如,在Python中实现只有一个想法,您可以使用自己的删除方法扩展Model类(尚未测试此代码,仅用于说明):

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个实体组上运行。