我的(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
实体时,我可以简单地指定一个等于相应Main
实体ID的数字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是唯一的,我就不应该有问题。到目前为止我所做的测试(在开发服务器上)似乎工作正常。
我的想法是正确的还是我遗漏了某些东西(到目前为止我的测试中是幸运的)?
答案 0 :(得分:3)
我多年来一直使用这种方法,从来没有遇到任何问题。
例如,每次更新实体时,每个索引字段也会更新。出于这个原因,我经常将一个复杂的实体拆分为"很少更新"部分和"经常更新"部分,并使用不同种类但两个实体的相同ID,例如AdEntity和AdCounterEntity。这样,正如您正确观察到的那样,应用程序逻辑被简化,因为您只需要记住一个ID以根据需要检索这两个实体。