【问题标题】:IdGeneratorStrategy unique for each kind每种类型的 ID 生成器策略都是唯一的
【发布时间】:2014-01-29 16:36:24
【问题描述】:

有什么方法可以创建仅在一种特定类型中唯一的主键(假设我在这里问的是正确的问题!-如果没有,请道歉)我注意到有一个“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 在我的应用程序中的所有项目中都是唯一的,因此联系人、管理员、约会、服务等都是单独的“表”(或种类?)所以它好的,它们都是独一无二的,但是审计跟踪可以有自己的计数空间,这样它就不会干扰我的“实际数据”的计数

我是否以正确的方式问这个问题,我真的试图弄清楚这个实体/种类/属性/关键的东西,但我不确定我是否完全理解这一切实际上是如何运作的!

【问题讨论】:

  • 是什么让您认为 id 在所有类型中都是独一无二的?生成的 id 对每种类型都是唯一的。否则allocate_ids 之类的设施将无法工作,因为您可以分配在种类之间重叠的 id 范围。
  • 我可能没有使用正确的术语...我是说我的应用程序中“联系人”表(种类)中单行的 ID 似乎永远不会与例如“约会”表中的单行(种类)。这确实是“轶事”,但我注意到我的应用程序中的第一行是“管理员”,它的号码是 31014,接下来是“联系人”,它是 29003,第三行是 ID 为 31034 的“用户”,据我所知,没有冲突!
  • 是的,不太可能发生冲突。这些 int 又大又稀疏。它类似于签名的 64 位。 (无法找到对密钥 id 定义的特定引用)。所以是的,从你有限的观察来看,它可能在所有类型中都是独一无二的。这是一个测试,手动为具有相同整数 id 的两种不同类型创建一个键。它会起作用的。 (假设你可以用 objectify 做这样的事情)

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


【解决方案1】:

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

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

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

【讨论】:

  • 很好的回复,谢谢,这就是我想象的工作方式,只是看起来有点奇怪的限制,但无论如何,它就是这样,感谢您清理它:D希望我永远不会在我的数据库中创建超过 2^53 行;)
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多