我已经阅读了很多关于App Engine的NDB中的ndb.StructuredProperty
和使用ancestor queries来保持相关实体组合在一起的内容。
但是,我不确定我理解哪种情况会要求哪种策略。
例如,如果我有用户类,并且用户可以创建链接,请修改设置,并获得成就,我是最好包括链接,设置和成就作为User对象内的StructuredProperties?
或许,我最好使用与祖先密钥组合在一起的单独实体?
让我们假设我将主要进行读取操作,偶尔会写入此数据。
ndb.StructuredProperty
示例:
class Achievement(ndb.Model):
date = ndb.DateTimeProperty(auto_now_add=True)
achievement_name = ndb.StringProperty(required=True)
class Link(ndb.Model):
title = ndb.StringProperty(required=True)
url = ndb.StringProperty(required=True)
class Settings(ndb.Model):
tile_layout = ndb.JsonProperty(required=True)
email_updates = ndb.BooleanProperty(default=True)
class User(ndb.Model):
user_name = ndb.StringProperty(required=True)
settings = ndb.StructuredProperty(Settings)
links = ndb.StructuredProperty(Link, repeated=True)
achievements = ndb.StructuredProperty(Achievement, repeated=True)
Ancestor分组示例:
class Achievement(ndb.Model):
user_key = ndb.KeyProperty(kind=User, required=True)
date = ndb.DateTimeProperty(auto_now_add=True)
achievement_name = ndb.StringProperty(required=True)
class Link(ndb.Model):
user_key = ndb.KeyProperty(kind=User, required=True)
title = ndb.StringProperty(required=True)
url = ndb.StringProperty(required=True)
class Settings(ndb.Model):
user_key = ndb.KeyProperty(kind=User, required=True)
tile_layout = ndb.JsonProperty(required=True)
email_updates = ndb.BooleanProperty(default=True)
class User(ndb.Model):
user_name = ndb.StringProperty(required=True)
谢谢!
答案 0 :(得分:1)
您作为基于实体组的模型示例(用户作为父级)实际上只是一个模型,其中包含对用户实体(对其密钥)的引用的实体。它不是实体组。如果您需要创建实体组,则父级密钥必须是后代密钥的一部分。
user_key = ndb.Key(User, 'some_username')
a = Achievement(parent=user_key, achievement_name='some_name')
无论如何,当您考虑将实体组(具有共同祖先的实体)用于您的数据模型时,首先要将其视为具有强一致性,事务性和位置性的单元。
您可以找到与实体组here相关的问题的答案以及类似的问题here。
结构化属性的缺点可能是它们无法独立于它们所属的实体进行检索。
正确的模型主要取决于您需要使用实体的方式。