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

Sql 如果对象已连接,获取标志的最佳方法是什么?,sql,hibernate,web-services,request,spring-data-jpa,Sql,Hibernate,Web Services,Request,Spring Data Jpa,假设我们有两个实体\表-用户和游戏(可以是任何东西)。用户可以将多个游戏标记为最喜爱的游戏。所以我们还有一个用户最喜欢的游戏(用户id,游戏id)表 然后,假设用户正在获取所有可用游戏的列表,其中一些游戏的“Favorite”标志应为true(使用分页,因此我们假设每次获取20个游戏)。因此,我在这里看到两种方法: 我们可以通过填充“收藏夹”字段来发出一个请求,例如。g 我们可以选择游戏,然后执行20个请求来检查一个游戏是否是用户最喜欢的 使用哪种方法更好?为什么?还有其他想法吗 在上一个项目中

假设我们有两个实体\表-用户和游戏(可以是任何东西)。用户可以将多个游戏标记为最喜爱的游戏。所以我们还有一个用户最喜欢的游戏(用户id,游戏id)表

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

  • 我们可以通过填充“收藏夹”字段来发出一个请求,例如。g
  • 我们可以选择游戏,然后执行20个请求来检查一个游戏是否是用户最喜欢的
  • 使用哪种方法更好?为什么?还有其他想法吗

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


    但在我看来,一般来说,在这种简单的情况下,一个带有JOIN的查询应该比20个简单查询运行得更快。尽管如此,当我们在user_Favorite_game table中有大量数据时,我不确定它将如何运行。请使用数据库执行其设计任务,并将结果作为原始查询的一部分提供给您

    您的DB在用户喜爱的游戏表上执行外部连接所花费的时间很可能会少于20个单独的favorite标志请求的网络开销

    确保表在增长时编制了适当的索引,并具有准确的统计信息

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

    触发20个查询(不管它们有多简单)将始终减慢您的应用程序。影响因素包括网络成本、查询运行等


    您应该启动一个查询以获取可用游戏的页面,然后通过传递该页面中存在的游戏ID进行另一个查询以获取该用户的“最喜爱”游戏列表。然后通过循环结果设置/取消设置标志。这样,您只需拨打2分贝的电话,将显著提高性能。

    谢谢!我大体上同意:)但可能我没有正确地指定它:不会有20个HTTP请求。前端客户端将只发出一个请求,但后端将向数据库发出20个请求。我是说询问。是的,我应该称之为查询:)听起来不错——那就跟着你的鼻子走吧。如果您发现这20个请求是即时的,那么这可能不是问题。我仍然会尝试设计这样一种方式,无论服务器有多近,我都不会给DB打20个电话。谢谢!它完全有意义,可以应用于每个服务调用,而无需重写查询)。请让我投票并点击“回答”按钮(请:)
    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;