在实体之间的关系中使用祖先vs.StructuredProperty

2024-04-27 15:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过很多关于^{}inappengine的NDB和使用ancestor queries将相关实体组合在一起的文章。在

然而,我不确定我是否理解哪些情况需要哪种策略。在

例如,如果我有一个User类,并且用户可以创建链接,修改设置,并获得成就,那么我是否最好将链接、设置和成就作为StructuredProperties包含在User对象中?在

或者,我最好使用单独的实体,这些实体用祖先密钥组合在一起?在

假设我将主要执行读操作,偶尔也会写入这些数据。在

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)

祖先分组示例:

^{pr2}$

谢谢!在


Tags: name实体true示例model链接requiredlink
1条回答
网友
1楼 · 发布于 2024-04-27 15:26:00

作为一个基于实体组(以用户为父级)的模型的示例,实际上只是一个由实体组成的模型,其中引用了用户实体(其键)。它不是实体组。如果需要创建实体组,父项的键必须是子体键的一部分。在

user_key = ndb.Key(User, 'some_username')
a = Achievement(parent=user_key, achievement_name='some_name')

不管怎样,当你使用一个与你的祖先实体的一致性时,首先要考虑的是与你的实体的一致性。在

您可以找到我对与实体组here和类似问题here有关的问题的答案。在

结构化属性的一个缺点是不能独立于它们所属的实体来检索它们。在

正确的模型主要取决于使用实体的方式。在

  1. 是否需要单独访问实体?在
  2. 您是否需要您的实体具有强大的或最终的一致性?在
  3. 实体多久创建/更新一次?在
  4. 你预计有多少实体?在
  5. 。。。在

相关问题 更多 >