【问题标题】:Is there any side effect of not having a physical entity for it to act as parent key没有物理实体作为父键是否有任何副作用
【发布时间】:2023-04-08 00:53:01
【问题描述】:

如果我浏览谷歌应用引擎教程,我可以看到他们的示例似乎鼓励我们为实体设置父级。

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

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 实体实际上并不存在。

虽然上面的代码运行得很好,但我想知道如果parent实体在物理上不存在,可能会出现什么问题?

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

我想在我执行User.get_or_insert 之后,下一个请求User.get_by_id 将返回最新值。我想知道,要实现强一致性,父键是否重要?

【问题讨论】:

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


    【解决方案1】:
    1. 只要您实际上不需要此父实体,就没有问题。

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

    您可能会遇到严重的问题。例如,如果实体“用户”是某个父实体的子实体,然后所有其他实体都是实体“用户”的子实体,这会将您的所有数据变成一个大实体组。假设您的应用相当活跃,您将看到由于此性能限制而导致数据存储操作失败。

    还要注意,如果您必须在其中包含父实体的键,则实体的键会变长。如果您创建实体链(例如,父 -> 用户 -> 相册 -> 照片),每个“照片”实体的键将包括相册键、用户键和父实体键。管理起来简直就是一场噩梦,并且需要更多的存储空间。

    【讨论】:

    • 我不打算让user 有孩子。那样的话,我觉得应该没问题吧?
    • 我对没有父母的担忧之一是“最终一致性”。写操作后,我希望我的读操作能够获取最新的写入值。我使用User.get_or_insert 来写(和读),User.get_by_id 来只读。我想知道,为了实现强一致性,父键是否重要?
    • ndb docsModel.get_by_idKey(cls, id).get()是一样的。作为 fetch-by-key,无论您是否有祖先,您将始终获得强一致性。虽然我不知道Model.get_or_insert。当您进行查询(= 索引扫描)时,最终一致性会发挥作用。
    • 最终一致性是您为快速性能付出的代价。有时最终的一致性很不方便,但几乎总有一种解决方案不会影响性能。
    • 注意使用父母会严重影响写入率。
    【解决方案2】:

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

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

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

    【讨论】:

    • 请编辑您的答案以提供此技术的示例。这听起来很有趣。谢谢!
    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2011-10-02
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多