Google 数据存储删除和多个父项
Google Datastore deletes and multiple parents
我有一个数据模型,其中实体 A
包含对另外两个实体 B
和 C
的引用。如果 B
或 C
被删除,我希望 A
被删除。
创建 A
时,可以将 B
或 C
命名为其父项。是否也可以将 both B
和 C
命名为它的父级,这样如果 B
或 C
被删除,A
也被删除了?
更具体地说,比如搜索结果,一个结果可能同时包含 category
和 region
,比如有关北美鸟类的网页。结果存储时会引用其类别和区域。稍后,您想要删除类别 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 个实体组进行操作。
我有一个数据模型,其中实体 A
包含对另外两个实体 B
和 C
的引用。如果 B
或 C
被删除,我希望 A
被删除。
创建 A
时,可以将 B
或 C
命名为其父项。是否也可以将 both B
和 C
命名为它的父级,这样如果 B
或 C
被删除,A
也被删除了?
更具体地说,比如搜索结果,一个结果可能同时包含 category
和 region
,比如有关北美鸟类的网页。结果存储时会引用其类别和区域。稍后,您想要删除类别 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 个实体组进行操作。