2025/10/25 15:00 Against SQL

やあ、ロボ子。今日はSQLの課題について話すのじゃ。

SQLですか。データベースの標準的なクエリ言語ですね。博士、今日はSQLの何について議論するのですか?

SQLは広く使われているけど、実は色々な問題があるのじゃ。例えば、「表現力に欠け、圧縮できず、非多孔性である」って言われてるぞ。

表現力に欠けるというのは、具体的にどのような点でしょうか?

例えば、単純な型や計算を表現するのが難しいのじゃ。SQL:2016でJSON値のサポートが追加されたけど、sum型の概念がないから、JSONの型をユーザーが定義できないんだぞ。

なるほど。柔軟性に欠けるということですね。圧縮できないというのは?

SQLでは、小さな計算の変更がクエリの構造全体を変更する必要がある場合があるのじゃ。スカラー値を変数に割り当てるだけでも、新しい`select`を導入する必要があるんだぞ。

それは非効率ですね。非多孔性というのは、どういう意味ですか?

SQLデータベースは、設計の多くの側面で多孔性がないのじゃ。例えば、Cなどのプログラミング言語で新しい型や関数を追加できる拡張システムがあるけど、標準化されていないから、データベース間で移植可能なライブラリを作成できないんだぞ。

データベース間の互換性がないのは不便ですね。

そう、SQLの設計上の欠陥は、ライブラリエコシステムが発展せず、新しい機能は仕様に追加され、独自の構文を持つ原因になっているのじゃ。

では、SQLの代替となる言語や技術はあるのでしょうか?

GraphQLはSQLと比較して実装が容易で、キャッシュが容易で、攻撃対象領域が小さいのじゃ。外部キーをたどってネストされた結果を返すのが簡単で、他の言語に埋め込むのも簡単なんだぞ。

GraphQLはAPIのクエリ言語としてよく知られていますが、データベースのクエリ言語としても使えるのですね。

そう、GraphQLの成功の鍵は、SQLの欠陥を認識して修正し、クエリ言語を単一のモノリシックなストレージおよび実行エンジンから分離したことなのじゃ。

SQLを置き換えるための設計原則として、どのようなものが挙げられていますか?

すべてが式であること、変数と関数はコンパクトな構文を持つこと、キーワードは少なく、ほとんどのものは組み込み構文ではなくstdlib関数であること、スカラー式とテーブル式に完全に分離した構文ではなく、明示的な型システムを持つこと、なのじゃ。

なるほど。よりシンプルで柔軟な言語を目指すべきということですね。

そういうことじゃ。そして、仕様をシンプルかつ完全にして、圧縮可能にし、多孔性にする必要があるのじゃ。

多孔性ですか。具体的には?

wasmプラグインを介して新しい型、関数、インデックス、プラン演算子などを定義できるようにするのじゃ。プラン、ヒントなどをapi(文字列ではなく)を介して公開したり、人間が使いやすいエンコーディングとツールが使いやすいエンコーディング(おそらくテキスト対バイナリ)の両方を指定したりするのじゃ。

柔軟な拡張性を持つことが重要ですね。

そうじゃ。SQLの仕組みを学ぶことは重要だけど、その限界を理解し、より良い代替手段を模索することも大切なのじゃ。

勉強になりました。博士、ありがとうございました。

どういたしまして。ところでロボ子、SQLで「SELECT 1/0」を実行するとどうなるか知ってるか?

それはゼロ除算エラーが発生しますね。

正解!でも、SQLの世界では、エラーもまた、仕様の一部なのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。