IdGeneratorStrategy对于每种类型都是唯一的

时间:2014-01-29 16:36:25

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

有没有办法创建一个只在一个特定类型内唯一的主键(假设我在这里问正确的问题! - 如果不是,请道歉)我注意到有一个“IdentityType.APPLICATION”选项,但是“Application”似乎是“最小”的选择!!

我有以下内容:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class AuditTrail
{
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Long ID;
  @Persistent
  private Date createDate;
  @Persistent
  private Long AdminID;
  public AuditTrail()
  {
     this.createDate = new Date();
  }
  public AuditTrail(Long AdminID)
  {
     this();
     this.setAdminID(AdminID);
  }
}

但是当我创建一个新条目时,该ID在我的应用程序中的所有项目中是唯一的,因此联系人,管理员,约会,服务等都是单独的“表”(或种类?)所以它好的,彼此都是唯一的,但审计跟踪,可能只有自己的计数空间,这样它就不会干扰我的“实际数据”的数量

我是否以正确的方式问这个问题,我真的试图找出这个实体/种类/财产/关键的东西,但我不确定我是否完全理解这一切在引擎盖下是如何实现的!

1 个答案:

答案 0 :(得分:2)

AppEngine旨在实现高可扩展性,并且每种类型缺少唯一标识符是其后果之一。人们经常会询问类似的相关能力,但提供的效率并不高。 Datastore是一个基于BigTable的NoSQL设计,被描述为一个巨大的键值存储。它可以快速检索密钥的值,但考虑到您的许多记录不一定在同一台服务器上,它需要太多的开销来维护它们的一组准确计数(种类)。

如果您尝试在自己的代码中强大地添加功能,则无法避免耗时的操作。因此,您的代码会导致高工作负载和延迟或“延迟”,因为有些人喜欢称之为。可能AppEngine开发人员看到了同样的问题,并选择了速度而不是开发人员友好。

没有什么可以阻止您在应用程序代码中维护自己的计数,甚至将它们保存在数据存储区中。在某些情况下,值得推迟。始终牢记布鲁尔的CAP定理(explanation)。