使用 Google App Engine,实体的大小限制为 1 MB。假设我有一个博客系统,并且期望每篇文章有数千条评论,有些段落很长。通常,没有限制,您只需将所有评论存储在与博客文章相同的实体中。但是在这里,会担心达到 1 MB 的限制。
另一种可能的方法,虽然效率低得多,但将每个评论存储为一个单独的实体,但这需要多次阅读才能获得所有评论,而不是仅仅阅读一次才能获得博客文章及其评论(如果它们在同一实体)。
处理此类案件的有效方法是什么?
使用 Google App Engine,实体的大小限制为 1 MB。假设我有一个博客系统,并且期望每篇文章有数千条评论,有些段落很长。通常,没有限制,您只需将所有评论存储在与博客文章相同的实体中。但是在这里,会担心达到 1 MB 的限制。
另一种可能的方法,虽然效率低得多,但将每个评论存储为一个单独的实体,但这需要多次阅读才能获得所有评论,而不是仅仅阅读一次才能获得博客文章及其评论(如果它们在同一实体)。
处理此类案件的有效方法是什么?
如果评论是线程化的,将它们存储为单独的实体可能是有意义的。
如果评论可以成为投票的目标,那么将它们存储为单独的实体是有意义的。
如果可以编辑评论,则将它们存储为单独的实体可以减少争用,并避免必须对所有评论进行悲观锁定,或者避免最后一次编辑覆盖先前编辑的风险情况。
如果您可以翻阅评论,出于多种原因将它们存储为单独的实体是有意义的,索引就是其中之一。
我有六个建议:
1)将评论存储在单独的实体中。使用内置缓存和游标的 NDB API。因此,您可以限制每次查看的查询成本。您可以使用仅键查询、祖先查询和投影查询进行快速访问。请参阅:https ://developers.google.com/appengine/docs/billing
2) 独立的实体使并发和索引更容易。
3) 看看 Search API 和 Prospective Search API。如果您有很多评论,搜索将很重要。由于搜索,您应该为您的评论使用单独的实体,这使得访问搜索结果变得非常容易。
4) 当您使用诸如 mapreduce 之类的工具来分析评论时,处理单独的实体也是首选。
5) 您可以随时根据您对博客引擎和 appstats 的体验进行优化。数据存储是真正的瓶颈还是使用的实例数量。我不知道你的用例,但你也可以使用客户端(浏览器)来优化和缓存结果。
6)处理评论的第三方解决方案呢?请参阅 Nick Johnson 的这篇文章,使用 Disqus javascript 在他的应用引擎博客引擎中进行评论和搜索:http: //blog.notdot.net/2009/10/Blogging-on-App-Engine-part-6-Comments-and-搜索