为不同种类的其他实体重新使用一个实体的 ID - 理智的想法?

re-using an entity's ID for other entities of different kinds - sane idea?

我的 (python) 应用程序使用了多个实体,其中许多实体处于 1:1 关系中。例如:

class Main(ndb.Model):
    field1 = ndb.StringProperty()
    #peer_key = ndb.KeyProperty(kind='Peer')

class Peer(ndb.model):
    field2 = ndb.IntegerProperty()
    #main_key = ndb.KeyProperty(kind='Main')

一些 Main 实体可能有一个 Peer 实体(在 Main 实体之后创建)完全是 1:1 关系。

我在想,在创建 Peer 实体时,我可以简单地指定一个数字 ID 等于相应的 Main 实体的 ID(由数据存储自动生成,因此保证是唯一的):

main_entity = Main(field1='blah')
main_entity.put()

peer_entity = Peer(id=main_entity.key.id(), field2=10)
peer_entity.put()

通过这种方式,我可以显着简化应用程序的逻辑,而无需存储和处理实体键来交叉引用这些实体,尤其是在跨请求传递它们时。例如,在我有主要实体的情况下,我可以简单地做:

peer_entity = Peer.get_by_id(main_entity.key.id())

同样,在我有对等实体的上下文中:

main_entity = Main.get_by_id(peer_entity.key.id())

根据 the documentation 键只是 (kind, id) 对,这意味着只要种类不同并且 ID 是唯一的,我 不应该 问题。到目前为止(在开发服务器上)我所做的测试似乎工作正常。

我的想法是正确的还是我遗漏了什么(到目前为止我的测试很幸运)?

我多年来一直使用这种方法,从来没有遇到过任何问题。

例如,每次更新实体时,每个索引字段也会更新。出于这个原因,我经常将一个复杂的实体拆分为 "rarely updated" 部分和 "frequently updated" 部分,并为两个实体使用不同种类但相同的 ID,例如AdEntity 和 AdCounterEntity。这样一来,正如您正确观察到的那样,应用程序逻辑得到了简化,因为您只需记住一个 ID 即可根据需要检索两个实体。