dataloader和lodash.memoize有什么区别?

时间:2019-05-26 05:55:50

标签: graphql lodash reselect

我进行了一个演示,使用lodash.memoize解决了N + 1查询问题。

这是我的查询案例:有10个帖子属于1个用户。而且,客户端GraphQL像这样查询:

query {
  posts{
    postId
    postTitle
    postAuthor{
      userId
      userNme
      userEmail
    }
  }
}

如果不使用dataloader或某些记事功能,它将向数据库发送11(10 + 1)次查询。对posts进行1次查询,对每个帖子的用户进行10次查询。

constructor() {
    super();
    this.userLoader = this.createLoader(this.findByIds.bind(this));
    this.userLoaderLodash = _.memoize(this.findByIds.bind(this));
  }

  public async findByIds(ids: string[]) {
    return this.db('users').whereIn('user_id', ids);
  }

  public async findById(id: string) {
    this.ids.push(id);
    // return new Promise((resolve, reject) => {
    // process.nextTick(() => {
    return this.userLoaderLodash(this.ids).then((users: any[]) => {
      // resolve(_.first(users));
      return _.first(users);
    });
    // });
    // }).then((user) => {
    // this.ids = [];
    // return user;
    // });

    // return this.userLoader.load(id);
  }

this.userLoaderdataloaderthis.userLoaderLodashlodash.memoize实现。

这是数据库调试日志:

{ method: 'raw',
  sql: '\n      SELECT * FROM posts;\n    ',
  bindings: [],
  options: {},
  __knexQueryUid: '046167c1-35d7-427f-8f3d-d4ac203670a6' }
{ method: 'select',
  options: {},
  timeout: false,
  cancelOnTimeout: false,
  bindings: [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
  __knexQueryUid: '450f19b7-3841-4c08-81f0-ca740f3abcf9',
  sql: 'select * from "users" where "user_id" in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' }

如您所见,使用lodash.memoize的方式似乎也可以解决N + 1查询问题。不使用process.nextTick似乎不会影响结果。

0 个答案:

没有答案