gpt4 book ai didi

postgresql - 使用分页时如何提高嵌套 graphql 连接的性能

转载 作者:行者123 更新时间:2023-12-04 04:17:43 24 4
gpt4 key购买 nike

我正在尝试实现某种基本的社交网络项目。它有 PostsCommentsLikes ,就像其他任何东西一样。

  • 一个帖子可以有很多评论
  • 一个帖子可以有很多赞
  • 一个帖子可以有一个作者

  • 我在客户端应用程序上有一个 /posts 路由。它通过分页列出 Posts 并显示它们的 titleimageauthorNamecommentCountlikesCount
    graphql 查询是这样的;
    query {
    posts(first: 10, after: "123456") {
    totalCount
    edges {
    node {
    id
    title
    imageUrl
    author {
    id
    username
    }
    comments {
    totalCount
    }
    likes {
    totalCount
    }
    }
    }
    }
    }

    我正在使用 apollo-serverTypeORMPostgreSQLdataloader 。我使用 dataloader 来获取每个帖子的 author。我只是用 authorIds 批处理请求的 dataloader ,使用 authors 查询从 PostgreSQL 获取 where user.id in authorIds ,将查询结果映射到每个 authorId 。你知道, dataloader 最基本的用法。

    但是当我尝试在每个 comments 下查询 likespost 连接时,我被卡住了。如果没有分页,我可以使用相同的技术并为它们使用 postId。但是现在我必须为分页包含过滤器参数。对于某些 where 条件,可能还有其他过滤器参数。

    我找到了 dataloader 的 cacheKeyFn 选项。我只是为传递给数据加载器的过滤器对象创建一个字符串键,它不会复制它们。它只是将唯一的传递给 batchFn 。但是我无法使用 TypeORM 创建 sql 查询来分别获取每个 firstafterorderBy 参数的结果并将结果映射回调用数据加载器的函数。

    我搜索了 spectrum.chat 源代码,我认为它们不允许用户查询嵌套连接。还尝试了 Github GraphQL Explorer,它可以让您查询嵌套连接。

    有没有推荐的方法来实现这一目标?我了解如何将 object 传递给 dataloader 并使用 cacheKeyFn 对它们进行批处理,但我无法弄清楚如何在一个查询中从 PostgreSQL 获取结果并将结果映射到从加载程序返回。

    谢谢!

    最佳答案

    所以,如果你稍微限制一下,这是可行的。限制是只允许在结果的第一页上进行批量连接,例如所以你并行获取的所有连接都是用参数完成的。这是一个合理的约束,因为它允许您执行诸如获取前 10 个提要项和每个提要项的前 3 条评论之类的操作,这代表了一个相当典型的用例。尝试在单个查询中支持独立分页不太可能满足 UI 的任何实际用例,因此这可能是过度优化。考虑到这一点,您可以使用 PostgreSQL 支持“为每个父级获得第一个 N 个子级”用例使用 window。

    这有点繁琐,但有很多答案可以帮助您找到正确的方向:Grouped LIMIT in PostgreSQL: show the first N rows for each group?

    所以使用 dateloader 你是如何使用 cacheKeyFn ,并让您的加载程序函数识别您是否可以执行优化(例如,在 null 之后,所有其他参数都相同)。如果可以优化,请使用窗口查询,否则像往常一样并行执行未优化的查询。

    关于postgresql - 使用分页时如何提高嵌套 graphql 连接的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60244596/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com