【问题标题】:Compound Key Performance For App Engine DatastoreApp Engine 数据存储区的复合键性能
【发布时间】:2014-10-21 19:08:35
【问题描述】:

我正在根据实体“B”的自动生成 ID 为实体“A”创建字符串数据存储 ID。我应该在 A ID 前面加上“A-PREFIX”-B.IntID() 还是加上 B.IntID()+“A-PREFIX”?

我假设我应该从 B ID 开始,因为它们是均匀分布的,以防止热点?

来自https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore

反模式 #1:实体键的顺序编号

谢谢, 安德鲁

【问题讨论】:

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


    【解决方案1】:

    您根本不需要任何前缀。密钥由实体种类和 ID 组成。因此,两个实体可能具有相同的 ID,但如果它们属于不同的种类,它们仍然具有唯一的键。

    这个例子工作得很好(Java 中的例子):

    Entity userEntity = new Entity("User");
    Long id = datastore.put(userEntity).getId();
    
    Entity loginEntity = new Entity("Login", id);
    datastore.put(loginEntity);
    

    请注意,如果您使用 Long id 并将其转换为 String,您的键将占用更多空间。所以使用 Long 作为 id 是一个更好的选择。

    【讨论】:

    • 好点!虽然如果我也有一个与 A 同种的 C,并且我想将 C 与 B 相关联,那么我需要使用字符串前缀,对吗?
    • 不,您可以简单地将 C 实体中的 B 作为属性 (userEntity.setProperty("users_relative", otherUserEntity.getKey().getId())) 引用,或者使 C 成为 B 的子实体。我想不出任何需要前缀的用例。
    • 你说得对,我可以简单地将 B 键存储在 C 中,反之亦然,这取决于我需要如何去。谢谢你的建议。
    • 最好存储一个 ID - 你总是可以从一个 id 创建一个密钥。一个 id 将比一个完整的 key 占用更少的空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多