JavaScript で SQL - AjaSQL

All About で JavaScript のガイドも勤めている高橋さんAjaSQL なる JavaScript (+PHP)のライブラリを公開しています。

 AjaSQLは、JavaScriptからSQL文をAjax発行し、サーバー側のゲートウエイを経由して、データベース(MySQL,SQLite...)へ接続、結果セットもJavaScriptAjax受信するツールです。

 基本構成は、Ajaxライブラリ(jslb_ajaxXXX.js)、AjaSQLライブラリ(jslb_ajasqlXXX.js)とPHPによるAjaSQLゲートウエイ(ajasql_gwXXX.php)および、データベース(JavaScript側からSQLiteMySQLを選択制御)です。

 AjaSQLを使うことで、今まで、サーバー側がひとりで一手に引き受けていた、 SQLデータベースの処理を、Ajax通信により、クライアント側JavaScriptへ分散することが可能になります。

で、気になってちょっと実装を覗かせてもらったのですが、"負荷を軽減させることができる"というのはちとできすぎかなと。このライブラリがやってるのは、JavaScript に埋め込まれた SQLXMLHttpRequest で、PHP で書かれた DB proxy (ゲートウェイ)に飛ばして出力を受け取るというもの。

マニュアルには HTML や XML としてデータがやりとりされることはないので負荷分散になりますってあるんですが、DB のデータを HTML や XML に変換するとか、データが HTML や XML になる分ふえたちょっとの冗長性が、アプリケーション全体の処理で支配的になるなんてことはそんなにないと思うのです。JavaScript から直接データベースに接続するならともかく、間に PHP で書かれたサーバーサイドのプログラムが挟まっている以上は、その中で HTML をしたり XML を生成したりするのとほとんど変わらないんじゃないかな。(そもそもゲートウェイの実装はPHPだしw) あと、PHP の中で mysql とか sqlite のコマンドを外部呼出ししてるので、サーバーサイドプログラムで直接データベースに接続しにいくよりむしろ遅いと思います。

このライブラリのいいところは負荷分散というところじゃなくて、サーバーサイドのコードをいじらなくても、クライアントプログラムでデータベースハンドリングができるって所なんじゃないかな。

(ちゃんと見てないんでできるかどうかわからないんだけど) AjaSQL ライブラリとゲートウェイは同じサーバーに置いておいて、AjaSQL ライブラリをクライアントから script 外部呼出しで読み込めるようにすれば、ライブラリに定義されている関数が使えるので、クライアント側の修正だけでデータベースから好きなデータを取ってこれる...と考えると結構面白い試みにも思えてきます。

僕なら、ゲートウェイXMLHttpRequestSQL を発行するライブラリに加えて、JavaScript による O/R マッパを追加した三層構造にするかな。O/R マッパは汎用的なつくりになっていて、(Perl でいうところの Class::DBI のように) その O/R マッパを利用した実際のデータベースにバインドするクラスを用意し、それを script タグによる外部呼出しでインポートできるようにすると。

すると、

var id = 12345;  // primary key
var employee = Employee.retrieve(id);
employee.name;
employee.age;
...

みたいなことが JavaScript でできるようになってエレガントじゃなかろうか。まあ、例によって言う易し行うは難しなんだけれども。