2014-01-29 22 views
0

有什么办法来创建一个主键,这只是一个特定种类内唯一的(假设我问正确的问题在这里 - !道歉,如果不是),我发现有一个“IdentityType.APPLICATION”选项,但“应用程序”似乎是“最小”的可用选项!IdGeneratorStrategy独特的各种

我有以下几点:

@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在我的应用程序中的所有项目唯一的,这样一联系,管理员,预约,服务等都是单独的“表格”(或种类),所以它们都是唯一的,但审计追踪可以有自己的计数空间,所以它不会干扰我的“实际数据”

我在正确的方式问这个,我真的试图找出这个实体/类/属性/关键的事情,但我不知道我完全理解它是如何全部在引擎盖下正常工作!

+0

是什么让你觉得ID只是在所有类型中都是唯一的?生成的id对每种类型都是唯一的。否则像'allocate_ids'这样的设施就无法工作,因为你可以分配不同类型的id范围。 –

+0

我可能没有使用正确的术语... 我说,在我的应用程序中的“联系人”表(实物)单行ID似乎从来没有与发生冲突,例如在“约定单行'桌子(善良)。这真的是“轶事”,但我注意到我的应用程序中的第一行是“admin”,其编号为31014,接下来是“联系人”,即29003,第三行是“用户”,ID为31034,就我所见,没有冲突! – johnvdenley

+0

是的,不太可能发生冲突。这些int大而稀疏。它像一个签名的64位。 (可以找到关键的id定义的特定引用)。所以,从你有限的观察来看,它可能是各种独特的。这里是一个测试,手动创建一个具有相同整数ID的两种不同类型的密钥。它会工作。 (假设你可以用物化来做这样的事情) –

回答

2

AppEngine上是专为高可扩展性和缺乏每一种独特的标识符是后果之一。人们经常询问类似的相关能力,但提供效率不高。 Datastore是基于BigTable构建的NoSQL设计,它被描述为一个巨大的键值存储。它可以快速检索密钥的值,但考虑到你的许多记录不一定在同一台服务器上,它会花费过多的时间来维持一组密钥(Kind)的准确计数。

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

没有什么距离保持在应用程序代码自己的罪名,甚至它们保存在数据存储阻止你。在某些情况下,这是值得推迟的。牢记布鲁尔的CAP理论(explanation)。

+0

很好的答复,谢谢,这就是我想象它的工作原理,似乎有点奇怪的限制,但无论如何,它是它是什么,感谢清理它:D只需要希望我的数据库中永远不会创建超过2^53行;) – johnvdenley