最近、RESTfulより優れていると主張するGraphQLについて学びました。しかし、なぜ単純にSQLステートメントをHTTP GETリクエストに入れないのだろうと思い始めました。
たとえば、GraphQLでは次のように記述します
{
Movie(id: "cixos5gtq0ogi0126tvekxo27") {
id
title
actors {
name
}
}
}
これは、対応するSQLよりもそれほど単純ではありません
SELECT id, title FROM movies WHERE id = cixos5gtq0ogi0126tvekxo27;
SELECT actors.name FROM actors, actors_movies WHERE actors.id == movies.actor_id AND movie.id == cixos5gtq0ogi0126tvekxo27;
クエリをURLエンコードしてサーバーに送信することができます
GET endpoint?q=SELECT%20id%2C%20title%20FROM%20movies%20WHERE%20id%20%3D%20cixos5gtq0ogi0126tvekxo27%3B%0ASELECT%20actors.name%20FROM%20actors%2C%20actors_movies%20WHERE%20actors.id%20%3D%3D%20movies.actor_id%20AND%20movie.id%20%3D%3D%20cixos5gtq0ogi0126tvekxo27%3B HTTP/1.1
はい、クエリURLは長すぎる可能性がありますが、RESTへの準拠を気にしない場合は、POST要求の本文に含めることができます。(ところで、RESTが意味をなすようにHTTP RFCを改訂する必要があると思います:クエリ文字列の長さを制限することは、実装を最初の段階で仕様と混合します)
クライアントからSQLを直接発行することには、次の利点もあります。
- GraphQLを解析するためにサーバー側のコード/ライブラリは必要ないため、開発時間が短縮されます。
- GraphQLを解析するためにサーバー側のオーバーヘッドは必要ないため、実行時間が短縮されます。
- SQLステートメントは、GraphQLよりもはるかに柔軟性があります。なぜなら、ほとんどの場合、後者はSQLに還元されるからです。
- 誰もがSQLを知っています。
それでは、GraphQLがSQLより優れている点は何ですか?