小编典典

将实体的ID重新用于其他不同种类的实体-理智的想法?

python

我的(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)。

我当时在想,在创建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是唯一的,我就 不会 遇到问题。我到目前为止(在开发服务器上)所做的测试似乎运行良好。

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


阅读 200

收藏
2020-12-20

共1个答案

小编典典

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

例如,每次更新实体时,每个索引字段也会更新。因此,我经常将一个复杂的实体分为“很少更新”部分和“频繁更新”部分,并且对两个实体使用不同种类但相同的ID,例如AdEntity和AdCounterEntity。这样,正如您正确观察到的那样,由于只需记住一个ID即可根据需要检索两个实体,因此简化了应用程序逻辑。

2020-12-20