@
RubyJack GraphQL 是用来自动整合其它接口或服务的,性能取决于 整合方式 以及 原来的接口或服务的性能。
如果就是简单地把几个接口拼在一起返回数据,很容易引发 N+1 次查询 /调用,性能就差了,
所以 Facebook 又搞了个 [DataLoader](
https://github.com/facebook/dataloader),从主查询(主表)里取出 副查询(副表)需要的所有 id,
将原来 N 次 WHERE id=$id 副查询 变为一次 WHERE id IN( $idList ) 来优化性能,
但使用 DataLoader 要写 userLoader 等一些实例
```js
var DataLoader = require('dataloader')
var userLoader = new DataLoader(keys => myBatchGetUsers(keys));
```
并且实现初始化
```js
function createLoaders(authToken) {
return {
users: new DataLoader(ids => genUsers(authToken, ids)),
}
}
```
和调用方法
```
// Request begins...
var userLoader = new DataLoader(...)
// And a value happens to be loaded (and cached).
userLoader.load(4).then(...)
// A mutation occurs, invalidating what might be in cache.
sqlRun('UPDATE users WHERE id=4 SET username="zuck"').then(
() => userLoader.clear(4)
)
// Later the value load is loaded again so the mutated data appears.
userLoader.load(4).then(...)
// Request completes.
```
在原来写一堆 Schema,Type,Resolver 的基础上又增加了不少工作量。
APIJSON 直接提供自动化的 join,不需要后端写任何代码,前端传一个 join 键值对就行:
```js
{
"[]": { //查询数组
"join": "</User/id@", // Comment LEFT JOIN User ON
User.id = Comment.userId
"Comment": {},
"User": {
"id@": "/Comment/userId",
"@column": "id,name" // SELECT id,name
}
}
}
```
可以用 APIJSONAuto-自动化接口管理平台 在线测试
http://apijson.org