新著が出ます:『プログラマのためのSQLグラフ原論』

今月下旬に、J.セルコの『Trees and Hierarchies 2nd Edition』の邦訳が刊行されます。同著者の代表作『プログラマのためのSQL 第4版』のスピンオフの一つで、RDB/SQLで木と階層構造を扱うための方法論にフォーカスしたなかなかマニア度の高い一冊です。主眼となる「入れ子集合モデル」については、私もあちこちの記事や書籍で紹介したことがあるので、ご存じの方もいるかもしれませんが、より包括的かつ理論面までカバーした本格派の内容になっています。

表紙の女性はマリア様でしょうか。本家の方が刊行されたときも「このおっさん誰?」という質問が相次ぎましたが、ガリレオという説が有力なようです。そう言われてみると本家は『星界の報告』のような格調を感じます。本書の方は、長らく定説とされてきたモデルをひっくり返そうという意味では『天体の回転について』みたいな性格もあるのですが、大型本の表紙が2連続でおっさんだと本棚が暑苦しくなるリスクを避けたと思われます。手堅い試合運びです。

以下に訳者前書きを掲載するので、購入する際の参考にしていただければと思います。

本書は、米国を代表するデータベースエンジニアの一人、ジョー・セルコの主著『プログラマのためのSQL』の「スピンオフ作品」であり、リレーショナルデータベースとSQLを使って木と階層構造を扱う方法論をテーマとしている。『プログラマのためのSQL』の第36章では木と階層構造を扱う方法について説明されているが、本書はまるまる一冊を使って、極めて詳細に論じている。


2000 年代からWeb 上でデータをやり取りするフォーマットとしてXMLの利用が多くなってきたこともあり、データベースにおいても階層構造を持ったデータを扱うことが増えてきた。この要望に対して、データベースの世界からの反応は2 つに分かれる。1つはXMLデータベースやグラフデータベースのように、非関係(非リレーショナル)モデルに基づくデータベースによってこうしたデータをうまく扱おうとする試み。もう1 つが、関係モデルの内部で工夫することで対応しようとする試みである。本書は、後者の試みにおける興味深い成果の1つである。


リレーショナルデータベースで木と階層構造を扱う方法は、大きく分けて以下の3つに分類される。


1. 隣接リストモデル
2. 経路列挙モデル
3. 入れ子集合モデル


隣接リストモデルは第2 章で論じている。ある意味で伝統的な方法論で、数十年前から知られているものだ。その考え方は、ノード同士をポインタチェーンでつなぐ手続き型の考え方をそのままリレーショナル(関係)モデルの世界に持ち込んだものである。この方法論は考え方の馴染みやすさとわかりやすさから、ほとんどデファクトスタンダードの地位を占めているが、本書でも指摘されているように、更新と検索のクエリが複雑になりやすいという欠点がある。


経路列挙モデルは第3章で取り上げられている。これはファイルシステムディレクトリやフォルダを管理する仕組みとよく似ているので理解しやすい。また、検索クエリが非常にシンプルかつ高速になるという利点があるが、更新はかなり面倒になるため、ほとんど木の構造が変わらない場合に力を発揮するモデルだと言える。


入れ子集合モデルは、第4 〜 6 章で取り上げられている。このモデルが本書の主要テーマと言って差し支えない。このモデルは、階層構造の従属関係を集合の包含関係で捉えなおすという視点の転換によって、集合の取り扱いに長けているSQLとの親和性を高めたモデルである。多様な検索クエリをシンプルに記述できるという利点があるが、階層構造の更新を行なう際にロックされるレコードの範囲が広くなるという欠点を持つ。この欠点を補うために、集合の座標を整数から有理数に拡張した「入れ子区間モデル」が導入される。


これら2 つのモデルは、まだ木と階層構造を扱う方法論として決定版と言えるほどの地位を確立しているわけではなく、むしろ改善点を抱えた発展途上にあるが、徐々にこのモデルを実装したソフトウェアも増えてきている。こうした利用状況については、訳者が付録で取りまとめているので、そちらも参照していただきたい。


いずれにせよ、技術的にも興味深いモデルであることはもちろん、「このような考え方があるのか」という新たな視点の転換というか気づきを与えてくれる面白さがあるのが── 著者の作品はいずれもそのような気づきに満ちている── 本書の大きな魅力である。さらに本書の後半では、二分木やペトリネットといったコンピュータサイエンスでよく利用される木構造、郵便番号や図書コードのような社会に浸透している階層構造の扱いについても考察している。


なお、翻訳にあたり、ストアドプロシージャやストアドファンクションは、OraclePL/SQLの構文を使って記述した。PL/SQLを選択したのは、プロシージャやファンクションを記述するために日本で広く利用されている手続き型の構文だからだ。残念なことに、プロシージャの構文はDBMSごとにバラバラで統一されていないので、他のDBMSで利用する場合は、適宜、コードを変更してほしい。


なお、本書の翻訳にあたり、坂井恵、木村明治の両氏から有益なコメントを多くいただいた。また翔泳社の片岡仁氏には、『プログラマのためのSQL 第4 版』に引き続き、困難な翻訳プロジェクト全般にわたってお世話になった。ここに謝意を表したい。