【问题标题】:Bulk writes when one object requires the Key of another当一个对象需要另一个对象的 Key 时批量写入
【发布时间】:2019-10-11 20:40:51
【问题描述】:

试图找出一个好的解决方案。使用 Python 和 NDB 库。

我想创建一个实体,并且该实体也绑定到另一个实体。两者是同时创建的。例如,为大量用户创建消息。我们有一个Inbox 表/种类和一个Message 表。

因此,一旦我们收集了我们想要的所有用户的密钥,我所做的只是创建 Inbox 实体,保存它,然后使用它返回并附加到 Message 的提供的密钥,然后保存Message。对于大量用户来说,这似乎相当昂贵。每个用户 2 次写入。通常我会自己创建对象,然后使用ndb.put_multi() 来批量写入。由于在保存之前没有Key,所以我不能这样做。

希望这是有道理的。想法?

【问题讨论】:

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


    【解决方案1】:

    看看 allocate_ids API。您可以传递父键并分配 id。 allocate_ids 调用保证 id 永远不会在该父键上下文中重用。 allocate_ids 是一个小操作而且速度很快。一旦分配了这些 id,就可以通过在引用它们的其他实体中引用分配的 id 来执行 put_multi。据我了解,消息实体本身没有被引用,如果是这样,您只需要为收件箱分配 ID(假设用户已经没有 ID)并在收件箱和消息实体上执行 multi_put。

    【讨论】:

    • 这似乎正是我想要的。我想我在for 循环内拨打了allocate_ids() 电话?确实意味着可能有数千个这样的电话。或者我应该使用size 参数预先分配,因为我知道我需要多少个键?并使用与我的for 循环相同的索引标识符来获取其中的索引?
    • 一次可以分配500个id。见cloud.google.com/datastore/docs/concepts/limits
    猜你喜欢
    • 2010-12-04
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2022-01-05
    • 2012-07-18
    相关资源
    最近更新 更多