如果对象已连接,则获取标志的最佳方法是什么?

时间:2019-06-03 12:39:53

标签: sql hibernate web-services request spring-data-jpa

假设我们有两个实体\表-用户和游戏(可以是任何东西)。用户可以将多个游戏标记为收藏。因此,我们还有一个user_favourite_game(user_id,game_id)表。

然后,假设用户正在获取所有可用游戏的列表,并且其中一些应该具有“收藏”标志= true(使用分页,因此我们假设每次获取20个游戏)。所以我在这里看到两种方法:

  1. 我们可以提出一个请求来填充“收藏夹”字段,例如g。
SELECT 
    g.*, 
    ufg.game_id IS NOT NULL AS favourite
FROM
    games g LEFT JOIN
    user_favourite_game ufg ON ufg.user_id = :userId AND g.id = ufg.game_id
ORDER BY
    g.id;
  1. 我们可以选择游戏,然后执行20个请求以检查游戏是否受到用户的喜爱。

哪种方法更好用?为什么?还有其他想法吗?

在上一个项目中,由于每个实体所需的计算复杂性,我们使用了第二种方法。因此,它比上面的示例复杂得多,并且几乎不可能在单个查询中进行计算。

但是总的来说,在我看来,在这种简单情况下,使用JOIN进行的单个查询的运行速度应比20个简单查询快。虽然,我不确定当user_favourite_game表中有很多数据时它将如何运行

2 个答案:

答案 0 :(得分:1)

将数据库用于设计目的,并将其作为原始查询的一部分提供给您结果。

您的数据库在用户喜欢的游戏桌上执行外部联接所花费的时间可能会少于20个单独的对“我的喜欢”标志的请求的网络开销。

确保随着表的增长而对表进行适当的索引并具有准确的统计信息。

这不是一个硬性规定,应该进行实际的性能测试,但是我观察到许多应用程序受到网络聊天的损害。如果每个请求的往返成本为250毫秒,那么您的20个通话将非常昂贵。如果您的往返费用为1毫秒,人们可能永远不会注意到。

答案 1 :(得分:0)

引发20个查询(无论它们有多简单)都会使您的应用程序变慢。这些因素包括网络成本,查询运行情况等。

您应该触发一个查询以获取可用游戏页面,然后通过传递该页面中存在的游戏ID进行另一个查询以获取该用户的“收藏”游戏列表。然后通过循环结果来设置/取消设置标志。这样,您将仅进行2次DB调用,这将显着提高性能。