在此之下,我具有用户实体组和交易实体。我自动为交易分配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,以及相应的存储使用情况如何?
答案 0 :(得分:1)
实体键ID与种类和祖先(可能还有名称空间)一起定义了唯一的实体键,即使该实体实际上不存在,它也是有意义的:在附属于祖先的实体组祖先中拥有子实体,而子祖先不存在。来自Ancestor paths(重点是我):
创建实体时,可以选择指定另一个实体 作为其父母;新实体是父实体的子代(请注意 与文件系统不同,父实体实际上不需要 存在)。
因此,您的虚拟实体实际存在与否的事实无关紧要:使用allocateIds()
预分配的虚拟实体的密钥ID永远不会过期。来自Assigning identifiers:
数据存储模式的自动ID生成器将跟踪那些 已经分配了这些方法,将避免重复使用它们 另一个实体,因此您可以安全地使用此类ID,而不会发生冲突。您 无法手动选择由哪些值返回
allocateIds()
方法。allocateIds()
返回的值是 由数据存储模式分配。
支持此观点的个人考虑: