有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java应用程序引擎数据存储:如何在没有连接的情况下实现POST和标记?

我正在Google App Engine(Java)中构建一个应用程序,用户可以在其中发表文章,我正在考虑在这些文章中添加标签,因此我将有如下内容:

在实体职位:

public List<Key> tags;

在实体标记中:

public List<Key> posts;

例如,查询带有某个标记的所有帖子是很容易的,但是我如何才能得到所有带有标记列表的帖子呢? 我可以对每个标记进行查询,然后对结果进行交集,但也许有更好的方法。。。因为如果有很多帖子,这会很慢

另一件可能更困难的事情是有一篇文章,让那些有共同标签的文章按照共同标签的数量排序,这样我就可以在某种程度上得到与这篇文章“相似”的文章

好吧,使用连接会容易得多,但我从应用程序引擎开始,并没有真正想到一个好的方法来取代连接

谢谢


共 (3) 个答案

  1. # 1 楼答案

    您可能想从Google IO查看此视频。关系索引实体是您所需要的,并允许您删除Tag实体上的List<Key> posts。以及Post实体上的List<Key> tags

  2. # 2 楼答案

    使用这种设计,我担心您的标记实体可能会成为瓶颈,特别是如果您希望一些标记非常常见的话。 我能想到的三个具体问题是get和put的效率、写争用和爆炸式索引。让我们以stackoverflow为例——现在有14000篇贴有“java”标签的帖子

    1. 这意味着每次需要获取java标记实体时,您都要从数据存储中提取价值14k的关键数据。然后,当你做一个put时,你会把它全部发回。这可能会增加很多字节
    2. 除了来回移动的字节外,每个put都需要更新索引。ListProperty中的每个条目都映射到一个单独的索引条目。所以现在你正在做大量的索引更新。这让我们想到了第三点
    3. 爆炸性指数。每个实体对其可以拥有的索引项数量都有限制。我认为每个实体的限额是5000英镑。所以这实际上是一个硬限制,限制有多少帖子可以有相同的标签

    进一步阅读:

    好消息是,您的一些需求将很容易由Post实体处理。 例如,您可以很容易地找到包含标签列表all的所有帖子,其中包含如下查询筛选器:

    Query q = pm.newQuery(Post.class)
    q.setFilter("tags" == 'Java' && "tags == 'appengine'");
    

    对于所有带有java或appengine标记的帖子,您需要对每个标记执行一次查询,然后自己组合结果。数据存储现在不处理或/IN类型操作

    寻找相关帖子听起来很棘手。喝点咖啡后我会考虑的