【问题标题】:One-to-Many relationship in ndbndb 中的一对多关系
【发布时间】:2013-06-19 11:59:22
【问题描述】:

我正在阅读 Google 应用引擎并准备一个示例以更好地理解它。

简而言之,用户可以记录一个月中每一天的条目,就像日历一样。 用户可以按月查看条目。所以一次不超过 30 个。

最初我使用的是db,并且一对多的关系是直截了当的。

但当我遇到ndb 时,我意识到有两种方法可以建立一对多关系。

1) 结构化属性看起来就像是用户模型上的重复属性。这是否意味着如果我检索一个用户,我会自动检索她输入的所有记录? (例如整年)但这不是很有效,是吗?我想这样做的好处是您可以在一次读取操作中获得所有相关数据。

    from google.appengine.ext import ndb

    class User(UserMixin, ndb.Model):
        email = ndb.StringProperty(required = True)
        password_hash = ndb.TextProperty(required = True)
        record = ndb.StructuredProperty(Record, repeated=True)

    class Record(ndb.Model):            
        notes = ndb.TextProperty()

2) 或者我可以使用更经典的方式:

    class User(UserMixin, ndb.Model):
        email = ndb.StringProperty(required = True)
        password_hash = ndb.TextProperty(required = True)

    class Record(ndb.Model):
        user = ndb.KeyProperty(kind=User)
        notes = ndb.TextProperty()

在我的用例中哪种方式更好?

【问题讨论】:

  • 能否在用户不知情的情况下读取Record 条目?如果是这样,如果他们需要User,我会使用ndb.KeyProperty(),然后ndb.StructuredProperty
  • @bnlucas 他们需要先登录才能查看/编辑/删除一个月内的日记录。因此,无论如何都需要在登录时获取用户,以查看哪些记录首先属于该用户。因此,您侦察ndb.StructuredProperty 是更好的交易吗?我是否仍然可以过滤当前月份以进行更便宜的读取操作,或者它会以哪种方式给我整个记录?谢谢

标签: google-app-engine app-engine-ndb


【解决方案1】:

使用 StructuredProperty 而不是 KeyProperty 的缺点是,对于 StructuredProperty,总实体大小 (1MB) 的限制适用于用户及其包含的所有记录的总和(因为结构化属性被序列化为用户实体的一部分) .使用 KeyProperty,每条记录本身都有 1MB 的限制。

【讨论】:

  • KeyProperty 就是这样。谢谢
猜你喜欢
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 2016-09-19
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多