GAE ndb 存储大型一对多关系的最佳实践

Posted

技术标签:

【中文标题】GAE ndb 存储大型一对多关系的最佳实践【英文标题】:GAE ndb best practice to store large one to many relations 【发布时间】:2014-01-02 21:11:54 【问题描述】:

我正在寻找存储大量评论实体的最佳实践,这些评论实体与另一个实体具有一对多关系。

我读了很多关于数据存储的限制,但不知道如何解决这个问题。

由于 1MB 实体限制,我无法将它们存储为 structured properties。

Guido van Rossum 还回答了关于 repeated properties 的问题,“如果您有超过 100-1000 个值”,请不要使用重复的属性。 所以重复属性也不是我的 cmets 的解决方案。

最后一个问题:解决这个问题的最佳做法是什么?祖先是机会吗?

编辑:在这个关于ancestor or reference properties Nick Johnson 的问题中提到“每个具有相同父级的实体都将在同一个实体组中,并且写入实体组是序列化的,所以如果你在这里使用祖先会减慢速度”同时重新编写多个实体。由于组中的所有实体都由在您的实例中构成组根的用户“拥有”,但是,这应该不是问题 - 事实上,您正在做什么实际上是一种推荐的设计模式。”

“同时编写多个实体”究竟是什么意思?当不同的用户同时对该实体发表评论时?

【问题讨论】:

【参考方案1】:

取决于您每张账单读取/写入的金额。

您可以将超过 1000 个的引用(取决于密钥大小和引用方式)存储为 json 压缩的未索引属性。但是请注意引用和取消引用该金额。加上您将在每个请求上传输的开销和数据量将很大。您不希望仅仅为了一个简单的请求就对服务器上的 1000000 个压缩实体密钥进行操作。如果您采用这种方式尝试优化这种方法,请尽可能智能地在客户端上进行操作。

寻找祖先和/或优化你的逻辑以使其不一致(例如,如果没有立即显示评论并不重要)并使用迭代器或指针或搜索(无论它被称为什么)

【讨论】:

感谢 Jimmy 的快速回答,因此祖先将是 cmets 的好习惯。我只会查询一次 10 cmets 的限制,然后将光标移到下一个。我已经用关于祖先的主题更新了我的问题,“同时编写多个实体意味着什么”?有什么缺点吗? @Yoda 尼克约翰逊所说的正是您需要的最佳答案。他的意思是,如果同时有许多写入,则请求完成需要更多时间。如果您没有为每个帖子(祖先)获得每分钟 60 cmets 之类的东西,那么您可能没问题。即使您每分钟获得 120 次读取,您也有更多的带宽(根据经验,即使有一些统计数据可以比较这些东西)。 GAE 的写入成本很高。要记住的主要事项。 感谢您的解释。那我就跟祖宗一起去吧! @Yoda 您还可以将帖子的密钥存储在评论中作为参考属性。请记住这一点以及更优化的方法。祖先最能提供一致性。

以上是关于GAE ndb 存储大型一对多关系的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

从数据存储区查询大量 ndb 实体的最佳实践

在 PostgreSQL 中存储一对多或多对多关系的最佳方式是啥?

多对多关系 GAE NDB 需要父母还是子女?

Laravel 中批量更新关系的最佳实践

预加载具有多对多关系的核心数据的最佳实践

设计自动化数据库的最佳解决方案? [复制]