python - 为不同种类的其他实体重新使用一个实体的 ID - 理智的想法?

标签 python google-app-engine google-cloud-datastore

我的 (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/

相关文章:

python - 使用 splitter 写入 html body

python - plt.setp 替代子图或如何在 x 轴上为子图设置文本旋转

python - 如何为 TfidfVectorizer 使用列表列表或集合列表?

java - API 请求 datastore_v3.RunQuery() 发生错误

java - 当我保存对象时,我无法从任务加载

android - 将敏感数据保存在数据库中-安全的服务器通信

python - 将带有字典的 Python List 转换为一个字典的最快方法

google-app-engine - Google Speech API v1beta1 很慢?

php - 在谷歌应用引擎的laravel coaster cms中使特定文件夹可写

java - Appengine 数据存储区父级或索引