代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

没有物理实体作为父密钥是否有副作用

  •  1
  • Cheok Yan Cheng  · 技术社区  · 9 年前

    如果我通过谷歌应用程序引擎教程,我可以看到他们的例子似乎鼓励我们拥有实体的父级。

    因此,我有以下可行的代码,用于用户创建(电子邮件是唯一的)

    def parent_key():
        return ndb.Key('parent', 'parent')
    
    
    class User(ndb.Model):
        email = ndb.StringProperty(required = True)
        timestamp = ndb.DateTimeProperty(required = True)
    
    
    class RegisterHandler2(webapp2.RequestHandler):
        def get(self):
            email = self.request.get('email')
            user_timestamp = int(time.time())
            user = User.get_or_insert(email, parent=parent_key(), email=email, timestamp=datetime.datetime.fromtimestamp(user_timestamp))
    

    笔记 parent 实体物理上不存在。

    虽然上面的代码运行得很好,但我想知道,如果 父母亲 实体物理上不存在?

    我对没有父母的担忧之一是 最终一致性 。在写入操作之后,我希望我的读取操作能够获取最新的写入值。我正在使用 User.get_or_insert 写入(和读取),以及 User.get_by_id 只读。

    我要在我执行后 用户.get_or_insert ,和下一个请求 用户.get_by_id 将返回最新值。我想知道 强一致性 ,父密钥是重要的东西吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Andrei Volgin    9 年前
    1. 只要您实际上不需要此父实体,就没有问题。

    2. 您不应轻易决定使用父实体。事实上,使用实体组(父子实体)限制了每秒可以更新的实体的数量,并且需要知道检索子实体的父密钥。

    你可能会遇到严重的问题。例如,如果实体“User”是某个父实体的子实体,那么所有其他实体都是实体“User”的子实体。这会将所有数据转换为一个大型实体组。假设你的应用程序相当活跃,你会看到数据存储操作由于这个性能限制而失败。

    还要注意,如果必须将父实体的键包含到实体中,则实体的键会变长。如果您创建一个实体链(例如,父-用户-相册-照片),每个“照片”实体的键将包括相册键、用户键和父实体键。这将成为一场噩梦,需要更多的存储空间。

        2
  •  0
  •   Dave W. Smith    9 年前

    使用与实际具有属性的实体(我认为您所指的是“物理实体”)不对应的父键是一种标准技术。

    您甚至可以稍后决定向该键添加属性。

    我多年来一直在使用这种技术。