我有一个数据模型,其中实体A
包含对其他两个实体B
和C
的引用。如果删除了B
或C
,我希望删除A
。
创建A
时,可以将B
或C
命名为其父级。是否也可以将 B
和C
命名为其父级,以便删除B
或C
,{{1} }也被删除了?
更具体地说,比如说搜索结果,结果可能同时包含A
和category
,比如北美的鸟类网页。结果存储时引用其类别和区域。稍后,您要删除类别region
,并且您希望删除结果。同样,您删除区域birds
并希望删除结果。
我讨厌如此漫长地谈论这样一个微不足道的场景。但它似乎没有涵盖在任何数据存储文档中。我错过了什么?它是一个基本上有缺陷的数据模型吗?
答案 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个实体组上运行。