将应用程序从GAE M / S数据存储迁移到HRD的影响

时间:2011-08-15 18:16:02

标签: google-app-engine

将应用程序从M / S数据存储区迁移到HRD时,需要避免一些陷阱。我对一个这样的特定区域提出了一个问题,即“同类的实体ID并不总是唯一的”。

在此进一步解释这是一个例子。

  1. 假设我有3个实体客户,联系方式,地址如下
  2. 联系实体引用客户使用客户密钥为 com.google.appengine.api.datastore.Key
  3. 地址实体引用使用客户密钥为Long的客户
  4. 这3个课程是:

    public class Customer {
      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Key id;
    
      @Persistent
      private String name;
    }
    
    public class Contact {
      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Key id;
    
      @Persistent
      private String name;
    
      @Persistent
      private Key customerId;
    }
    
    
    public class Address {
      @PrimaryKey
      @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
      private Key id;
    
      @Persistent
      private String address;
    
      @Persistent
      private Long customerId;
    }
    

    所有实体都是根实体。

    现在,当我们在Contact和Address实体中迁移 customerId 时会发生什么?他们还能继续工作,还是在移民之前我们需要做些什么特别的事情?

    谢谢!

1 个答案:

答案 0 :(得分:1)

您所指的是如何构建密钥。实体的密钥将由以下内容组成:

  • 您的申请ID
  • 当前命名空间
  • 父级<-- this allows ids to be non-unique within a kind
  • 的层次结构
  • 善意的名字
  • 给定的key_nameid

因此,要使密钥具有唯一性,这些部分中的任何一个都可能会发生变化。在一种类型中,在您应用内的单个命名空间内,唯一的时间ID可能不唯一,就是您为该实体设置了parent

这意味着您定义的所有根实体将具有唯一的ID /名称

如果您需要保证指定的ID在某种类型中是唯一的,即使在具有祖先层次结构的实体中也是如此,您可以;

  1. 重新考虑你的设计。如果您在不需要/拥有父项的情况下按实际组ID引用实体,则可能在不需要的地方应用实体组
  2. 您可以根据Kind的根版本手动allocateIds