java应用程序引擎数据存储:如何在没有连接的情况下实现POST和标记?
我正在Google App Engine(Java)中构建一个应用程序,用户可以在其中发表文章,我正在考虑在这些文章中添加标签,因此我将有如下内容:
在实体职位:
public List<Key> tags;
在实体标记中:
public List<Key> posts;
例如,查询带有某个标记的所有帖子是很容易的,但是我如何才能得到所有带有标记列表的帖子呢? 我可以对每个标记进行查询,然后对结果进行交集,但也许有更好的方法。。。因为如果有很多帖子,这会很慢
另一件可能更困难的事情是有一篇文章,让那些有共同标签的文章按照共同标签的数量排序,这样我就可以在某种程度上得到与这篇文章“相似”的文章
好吧,使用连接会容易得多,但我从应用程序引擎开始,并没有真正想到一个好的方法来取代连接
谢谢
# 1 楼答案
您可能想从Google IO查看此视频。关系索引实体是您所需要的,并允许您删除
Tag
实体上的List<Key> posts
。以及Post
实体上的List<Key> tags
# 2 楼答案
使用这种设计,我担心您的标记实体可能会成为瓶颈,特别是如果您希望一些标记非常常见的话。 我能想到的三个具体问题是get和put的效率、写争用和爆炸式索引。让我们以stackoverflow为例——现在有14000篇贴有“java”标签的帖子
进一步阅读:
这个post涉及到一些大列表的问题
Exploding indexes
好消息是,您的一些需求将很容易由Post实体处理。 例如,您可以很容易地找到包含标签列表all的所有帖子,其中包含如下查询筛选器:
对于所有带有java或appengine标记的帖子,您需要对每个标记执行一次查询,然后自己组合结果。数据存储现在不处理或/IN类型操作
寻找相关帖子听起来很棘手。喝点咖啡后我会考虑的
# 3 楼答案
请参阅@topchef的博客文章:Efficient Keyword Search with Relation Index Entities and Objectify for Google Datastore。它讨论了使用关系索引实体和Objectify实现具有列表属性的搜索