我正在Google App Engine(
Java)中构建一个应用程序,用户可以在其中发帖,我正在考虑在这些帖子中添加标签,所以我将会有这样的:
实体发布:
public List<Key> tags;
实体标签:
public List<Key> posts;
很容易查询,例如,所有具有某个标签的帖子,但是如何获取所有具有标签列表的帖子?
我可以查询每个标签,然后做一个交叉的结果,但也许有一个更好的方式,因为这将是很慢的很多帖子.
另一件事可能会更困难的是收到一个帖子,获得标签共同按照常见标签数量排列的帖子,所以我可以以某种方式获得“类似”的帖子.
那么,加入这将是一个很容易,但我开始与应用程序引擎,不能真正考虑一个很好的方式来替换联接.
谢谢!
解决方法
有了这个设计,我恐怕你的标签实体可能是一个瓶颈,特别是如果你期望一些标签是非常普遍的.
我可以想到的三个具体问题是您的获取和投放的效率,写入争用和爆炸性索引.我们来看看stackoverflow的一个例子 – 现在有14,000个帖子标记为“java”.
我可以想到的三个具体问题是您的获取和投放的效率,写入争用和爆炸性索引.我们来看看stackoverflow的一个例子 – 现在有14,000个帖子标记为“java”.
这意味着每次您需要获取您的java标签实体时,您将从数据存储区中提取14k的关键数据.那么当你做一个put时,你会发回它.这可能会增加很多字节.
>除了字节来回,每个put将需要更新索引. ListProperty中的每个条目映射到单独的索引条目.所以现在你正在做很多索引更新.这导致我们到3号…
>爆炸指数.每个实体对它可以拥有的索引条目有多少限制.我认为每个实体的限额是5000.所以这实际上是有多少个帖子可以拥有相同标签的硬限制.
进一步阅读:
>这个post涉及大型列表的一些问题
> Exploding indexes
好消息是,您的一些要求将被Post实体轻松处理.
例如,您可以使用以下查询过滤器轻松找到所有包含标签列表的帖子:
Query q = pm.newQuery(Post.class) q.setFilter("tags" == 'Java' && "tags == 'appengine'");
对于所有具有java或appengine标签的帖子,您需要对每个标签执行一个查询,然后自己组合结果.数据存储区现在不处理OR / IN类型操作.
发现相关帖子听起来很棘手.一些咖啡后,我会考虑一下.