为不同种类的其他实体重新使用一个实体的 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 即可根据需要检索两个实体。
我的 (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 即可根据需要检索两个实体。