我的(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实体可能具有完全按1:1关系的Peer实体(在实体之后创建Main)。
Main
Peer
我当时在想,在创建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())
根据文档,密钥是(kind, id)成对的,这意味着只要类型不同且id是唯一的,我就 不会 遇到问题。我到目前为止(在开发服务器上)所做的测试似乎运行良好。
(kind, id)
我的想法是正确的还是我遗漏了什么(到目前为止,我在测试中只是很幸运)?
我多年来一直使用这种方法,从来没有任何问题。
例如,每次更新实体时,每个索引字段也会更新。因此,我经常将一个复杂的实体分为“很少更新”部分和“频繁更新”部分,并且对两个实体使用不同种类但相同的ID,例如AdEntity和AdCounterEntity。这样,正如您正确观察到的那样,由于只需记住一个ID即可根据需要检索两个实体,因此简化了应用程序逻辑。