是否应该编写实体以确保不会重用自动分配的ID?

时间:2019-06-15 04:04:35

标签: google-cloud-datastore

在此之下,我具有用户实体组和交易实体。我自动为交易分配ID。我想创建用于与支付服务集成的唯一密钥。由于事务不是根实体,因此不能保证自动分配的ID是唯一的,因此我不能将它们用作唯一键。我目前正在按照

的建议进行操作

Google Cloud Datastore unique autogenerated ids

将具有一个虚拟根实体并为其分配ID,并将该ID与交易实体一起存储为单独的字段。但是,由于它是虚拟的,因此我目前不将虚拟实体本身写入数据存储区。

我还阅读了其他帖子

When using allocateIds(), how long do unused IDs remain allocated?

Are deleted entity IDs once again available to App Engine if auto-generated for an Entity?

但我仍然不确定。我是否必须仅使用密钥插入该虚拟实体?如果没有,如何跟踪为该虚拟实体分配的所有ID,以及相应的存储使用情况如何?

1 个答案:

答案 0 :(得分:1)

实体键ID与种类和祖先(可能还有名称空间)一起定义了唯一的实体键,即使该实体实际上不存在,它也是有意义的:在附属于祖先的实体组祖先中拥有子实体,而子祖先不存在。来自Ancestor paths(重点是我):

  

创建实体时,可以选择指定另一个实体   作为其父母;新实体是父实体的子代(请注意   与文件系统不同,父实体实际上不需要   存在)。

因此,您的虚拟实体实际存在与否的事实无关紧要:使用allocateIds()预分配的虚拟实体的密钥ID永远不会过期。来自Assigning identifiers

  

数据存储模式的自动ID生成器将跟踪那些   已经分配了这些方法,将避免重复使用它们   另一个实体,因此您可以安全地使用此类ID,而不会发生冲突。您   无法手动选择由哪些值返回   allocateIds()方法。 allocateIds()返回的值是   由数据存储模式分配。

支持此观点的个人考虑:

  • 数据存储区没有对相同种类的实体,祖先和名称空间进行限制,因此它应该支持几乎无限数量的唯一ID。恕我直言,这意味着甚至不必考虑重新使用它们。这可能就是为什么没有提及分配的ID的任何截止日期或到期时间的原因。
  • 如果要重复使用已删除实体的ID,则会在从备份还原数据存储区实体时引发重大问题-可能会用先前使用相同ID的实体覆盖具有重复使用ID的较新实体