ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-避免使用appengine爆炸索引和实体组写速率限制

2019-12-08 17:11:34  阅读:265  来源: 互联网

标签:google-app-engine indexing java


我有一个其中有课程,主题和标签的应用程序.每个主题可以位于许多课程中,并具有许多标签.我想查找具有特定标签x且位于特定课程y中的每个主题.

>天真的,我给每个标准列出了课程ID和标签ID,因此我可以从Topic中选择*,其中tagIds = x& courseIds = y.我认为此查询将需要一个爆炸式的索引:具有30个课程和30个标签的我们正在查看〜900个索引条目,对吗?在50 x 20的分辨率下,我远远超过了5000个条目的限制.
>我可以从tagIds = x的Topic中选择*,然后使用for循环遍历结果,仅选择其courseIds.contain(y)的Topic.这将返回比我感兴趣的结果更多的结果,并花费大量时间对这些结果进行反序列化,但是索引仍然很小.
>我可以从tagIds = x的主题中选择__KEY__,并从CourseIds = y的主题中选择__KEY__,然后在我的应用程序代码中找到交集.如果集合很小,这可能不是不合理的.
>我可以创建一种带有tagId和courseId字段的联接表TopicTopLookup.这些实体的父键将指向相关主题.然后,我需要为CourseId x tagId x相关主题ID的每种组合制作一个TopicTagLookup实体.这实际上就像创建我自己的索引一样.它仍然会爆炸,但是不会有5000个条目的限制.但是,现在,我需要将5000个实体写入同一实体组,这将超出实体组的写入速率限制!
>我可以预先计算每个查询. TopicTagQueryCache实体将保存tagId,courseId和List< TopicId>.然后查询看起来就像从TopicTagQueryCache选择*,其中tagId = x&& courseId = y,获取主题ID列表,然后在列表上使用getAllById调用.与#3类似,但每个courseId x tagId只有一个实体.不需要实体组,但是现在我有了这个潜在的庞大清单,可以进行事务维护.

Appengine似乎非常适合您可以预先计算的查询.我只是不太了解一种有效地预先计算此查询的方法.这个问题基本上可以归结为:

什么是组织数据的最佳方法,以便我们可以进行设置操作,例如在课程和标签的交集中查找主题?

解决方法:

您对选项的评估是正确的.不过,如果您不需要任何排序条件,则App Engine数据存储区已使用合并联接策略为您完成了选项3.您只需在选项1中详细说明即可进行查询,而无需任何类型或不等式过滤器,App Engine会在数据存储区内部进行合并联接,并仅返回相关结果.

选项4和5与this talk中记录的关系索引模式相似.

标签:google-app-engine,indexing,java
来源: https://codeday.me/bug/20191208/2093133.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有