我的 (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 是唯一的,我就不应该有问题。到目前为止(在开发服务器上)我所做的测试似乎工作正常。
我的想法是正确的还是我遗漏了什么(到目前为止我的测试很幸运)?
最佳答案
我多年来一直使用这种方法,从来没有遇到过任何问题。
例如,每次更新实体时,每个索引字段也会更新。出于这个原因,我经常将一个复杂的实体拆分为“很少更新”的部分和“经常更新”的部分,并为两个实体使用不同种类但相同的 ID,例如AdEntity 和 AdCounterEntity。这样一来,正如您正确观察到的那样,应用程序逻辑得到了简化,因为您只需记住一个 ID 即可根据需要检索两个实体。
关于python - 为不同种类的其他实体重新使用一个实体的 ID - 理智的想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34954102/