初出:SoftwareDesign 1999/1月号 「特集 オープンソース時代のデータベース活用法 PostgreSQL徹底解説」 『PostgreSQL ORDBMS』 くわむらじゅん JuK@YOKOHAMA.Email.Ne.jp 1. PostgreSQLの歴史 オープンソースのオブジェクト・リレーショナ ルデータベース・マネージメントシステム(ORDBMS) として最近脚光を浴びてきましたPostgreSQLですが、 意外にもその源流は1970年代、IBMのSYSTEM-Rと共 にRDMSの実装の草分けとなったUniversity INGRES にありました。 1970 1980 1990 1997 INGRES(UCB) -> Ingres(RT) -> IngresII(CA) POSTGRES(UCB) -> ILLUSTRA(IIT) -> Universal Server(Informix) | `-> Postgres95(UCB) -> PostgreSQL(postgresql.org) (1) INGRES Edgar F. Codd博士がリレーショナルデータベー スの元となるリレーショナルデータモデルを提案 したのは1970年でした。集合論に立脚し、二次元 の表の集まりのようなもの(リレーションセット) をデータベース(データバンクと呼ばれていまし た)と考えたのでした。それから、数年を経てその データベースの管理系:リレーショナルデータベー スマネージメントシステム(RDBMS)の実装が世の 中に出てきました。その一つがカリフォルニア大 学バークレー校(UCB)で開発されたINGRES (INteractive Graphics and REtrieval System) でした。Michael Stonebraker教授はINGRESの開発 を当時脚光を浴び始めたマルチタスクOSのUNIX上 で行ないました。INGRESはQUEL(Query Language) という言語を用いました。[1] INGRESは1980年頃にはほぼ完成し、リレーショ ナルテクノロジー社がIngresとして商用化(*2)し ましたので、これと区別をするためにUniversity INGRESと呼ばれています。University INGRESは もともとシングルユーザ向けに開発されました。 Version8では共有のためのロック機構もありまし たが、実際にはあまり役に立ちませんでした。ま た、英語しか使えないことも、データベースに日 本語を保存したい我々にとってはいまひとつ魅力 に欠ける点でした。 (*2) 現在はコンピュータアソシエイツ社から Ingres IIが出荷されていてLinux版もあります。 (http://www.caj.co.jp/products/ingres_j.htm) (2) POSTGRES 1986年、Stonebraker教授は新たなプロジェクト で全く新しい発想と実装によるオブジェクト指向 の拡張RDBMSの基礎技術の研究を始めました。そ れがPOSTGRESでした。言語にQUELの流れを汲む PostQUELを使いました。POSTGRESは、あまりにも 多くの新しいこと(を盛り込もうとしたためか、な かなか安定しては動かなかったようです。1994年 にPOSTGRESリリース4をもってプロジェクトは終 了しました。Stonebraker教授はPOSTGRES開発で 培った技術をILLUSTRAと言うオブジェクトリレー ショナルDBMS(ORDBMS)としてIllustraインフォメー ションテクノロジーズ社にて商用化しました(*3)。 ユーザ定義関数の組み込みが可能であることは、 オブジェクトリレーショナルDBMSであるPOSTGRES の特徴の一つでした。(*4) POSTGRES4.2はある程度安定して動き、Tcl/Tkに よるPGBrowseというGUIやONYXという4GLインター フェースも貢献されていました。また、バイナリ アーカイブも入手可能でした。そのころ、石井達 夫氏がComputerToday誌に書かれた記事(*5)で、 POSTGRESで日本語EUCが使えることが紹介されま した。同氏は日本語による正規表現検索のための パッチを作成されました[2]。それまで、商用以 外のDBMSでは十分に日本語を使えるものが無くて、 仕方なくPerlで書かれた簡易DBMSなどを使ってい た筆者にとっては朗報でした。 ただ、歴史的な経緯やオブジェクト拡張により、 POSTGRESを使うための問い合わせ言語やPOSTGRES に関する文書の記述には、あまり一般的でないコ マンド名や用語も使われているため、SQLでDBMS の利用を覚え始めた人達にとっては幾分使い難い ものだったと思います。たとえば、次の各項目は 同じことを意味する用語の集まりです。 * 行(row)、レコード(record)、タップル(tuple)、インスタンス(instance) * カラム(column)、属性(attribute)、フィールド(field) * 表(table)、関係(relation)、クラス(class) * カーソル(cursor)、ポータル(portal) POSTGRESでいうところのオブジェクトリレーショ ナルDBMSの位置付けは図-1のように、リレーショ ナルDBMS(RDBMS)とオブジェクト指向 DBMS(OODBMS)の特長を適度に併せ持ったものです。 リレーションの定義に継承を使えたり、関数や索引 をユーザ定義により拡張できるうえに、RDBMSの持 つ高速性能を維持します。[3] +-----------+-----------+ | | | RDBMS: Relational DBMS 問い合わせあり| RDBMS | ORDBMS | ORDBMS: Object Relational DBMS | | | +-----------+-----------+ | | | FS: File System 問い合わせなし| FS | OODBMS | OODBMS: Object Oriented DBMS | | | +-----------+-----------+ 単純なデータ 複雑なデータ 図-1. オブジェクトリレーショナルDBMSの位置付け (*3) 現在ILLUSTRAはInformix社のユニバーサル サーバオプションとなっています。 (*4) ILLUSTRAにはデータブレードと呼ばれるオ ブジェクト拡張をオプションとして用意してあり ます。 (*5) 記事によるとこのころからCGIを使ってWEB にDBを吊り下げたりしていたようです。 (3) Postgres95 その後しばらくは、Paul M. Aoki氏を中心に POSTGRESメーリングリストによるネットワーク上 でのサポートが続きました。Aoki氏のあとを引き 継いだJolly Chen氏とAndrew Yeu氏は POSTGRES4.2から余分な機能をそぎ落とし、問い 合わせ言語をSQLに置き換えるなどの変更を行な い、Postgres95として1995年にリリースしました。 そして、Stonebraker教授の新たな分散データベー ス研究プロジェクトでMaripoza開発用DBMSエンジ ンとして使われています。 このころ、PHP/FIによってWEBのドキュメント 中に埋め込めるプログラムにDBアクセスのコード を直接書き込めるようになり、WEBブラウザ経由 のアクセスも容易になりました。また、ODBCド ライバが提供されるようになったため、WEB経由 にしなくても直接Windowsからアクセスをするア プリケーションの作成も可能となりました。 表-1. SQLとQUELの代表的なコマンドの対比表 SQL | QUEL --------+--------- CREATE | CREATE DROP | DESTROY INSERT | APPEND UPDATE | REPLACE DELETE | DELETE SELECT | RETRIEVE (3) PostgreSQL Chen氏とYeu氏による開発やサポートはMarc G. Fournier氏を中心とした沢山のネットワーク上の ボランティア達に引き継がれ、SQL92準拠などを 目標に、続けられています。1996年にメジャーバー ジョンアップを行なう際に、メーリングリスト上 での投票によりPostgreSQLに改名されました。バー ジョン番号もPOSTGRESからの通番を復活させまし た。POSTGRESが4.2で終っていたので、それに続 くPostgres95をバージョン5として、PostgreSQL のバージョンは6になったわけです。現在、 PostgreSQLのバージョンは6.4で1998年11月にリ リースされました。 PostgreSQLにはpgaccessというGUIを始め、様々 な言語とのインターフェース、埋め込みSQLなど が用意されていて、アプリケーションからの利用 の可能性が広がっています。 以下はPostgreSQLに関するインターネット上の 情報へのポインタです。 インターネット上でのPostgreSQLに関する情報 の源: http://postgreSQL.org/にあります。 UCBにおける過去と現在のデータベース関係の開 発プロジェクト: http://s2k-ftp.cs.berkeley.edu:8000/ 石井達夫さん主催の日本語PostgreSQLメーリン グリスト(pgsql-jp ML): http://www.sra.co.jp/people/t-ishii/PostgreSQL/ いちろうさんが座長をするPostgreSQLの文書和 訳プロジェクト: http://www.imasy.or.jp/~ichiro/postgres/ml.html FreeBSDユーザのためのPostgreSQL ports: ftp.jp.freebsd.org:/pub/FreeBSD/ports/japanese/postgresql (あるいは世界中のFreeBSDミラー・サイト) 堀田倫英さんの和訳された文書: http://www.remus.dti.ne.jp/~sim/postgres/index.html まえだみつひろさんの和訳された文書: http://pg.cni.co.jp/ FAQ和訳, Kerberosでの認証など: http://www.rccm.co.jp/~juk/pgsql/ 2. PostgreSQLの言語インターフェース PostgreSQLの言語インターフェースを、Plamo Linux版PostgreSQLの実行例にて紹介します。 (*6) (1) プリプロセッサ ecpgは簡単な記述でC言語のソースを生成するこ とのできるプリプロセッサです。市川哲彦さんに より日本語対応がされています。ecpgはEUC対応 でecpg-sjはSJIS対応です。ただし、ecpg-sjは SJIS対応のCコンパイラでのみ使えます。 % ecpg test2.pgc % cc -I/usr/local/pgsql/include test2.c \ -L/usr/local/pgsql/lib -lpq -lecpg -o test2 で実行モジュールができますので、以下のように 実行します。 % createdb junk % test2 % destroydb junk (2) JAVA JDBC postgresqlドライバのサンプルpsql.java の実行例 JDBC ドライバの日本語エンコーディングの拡張 はたかばとしはるさんと持田修司さんによるもの です (http://www.yo.rim.or.jp/~mochid/postgresql-jdbc/)。 % cd ~postgres/example/interfaces/jdbc % java example.psql jdbc:postgresql:postgres postgres postgres PostgreSQL psql example v6.3 rev 1 Connecting to Database URL = jdbc:postgresql:postgres Connected to PostgreSQL 6.3 [1] ... (3) Python Python(*7)のモジュールPyGreSQLのサンプル basics.pyの実行例 % python >>> import basics <= -------------------------------------------------- ...モジュールの使い方の表示... -------------------------------------------------- >>> cnx = basics.connect() <= >>> basics.demo(cnx) <= ... (4) Perl PerlによるCGI経由でブラウザからPostgreSQLの DBにアクセスできます。例題として付属の ApachePg.plをCGI用のディレクトリにコピーし、 1行目のperlのパスを直して、実行権を与えてや るとCGIとして動きます。 # cd /usr/local/etc/httpd/cgi-bin # cp ~postgres/example/interfaces/perl5/ApachePg.pl . # chown nobody ApachePg.pl # chmod +x ApachePg.pl これにLynxを使ってアクセスしてみました。 % lynx http://localhost/cgi-bin/ApachePg.pl
図 2 Lynx から ApachePg.pl の使用例 (5) Ruby Ruby はまつもとゆきひろさんの作られたオブ ジェクト指向スクリプト言語です (http://www.netlab.co.jp/ruby/)。 rubyの postgres拡張モジュールはまつもとえいじさんに よるものです。 Ruby(*8)のpostgresモジュールのサンプル psql.rbの実行例 % psql.rb Welcome to the POSTGRESQL interactive sql monitor: Please read the file COPYRIGHT for copyright terms of POSTGRESQL type \? for help on slash commands type \q to quit type \g or terminate with semicolon to execute query You are currently connected to the database: postgres postgres=> ... (6) その他のインターフェース CやC++のライブラリはもちろんのこと、Tcl/Tk のライブラリやシェルも初期のころからあり、 GUIのpgaccessはTcl/TKで書かれています。 その他のインターフェースに、WEB文書の中に 記述してPostgreSQLとの連携ができるPHP/FI(堀 田倫英さんの記事参照)やWindowsのODBCドライバ でPostgreSQLサーバへのアクセスが可能な PsqlODBC(片岡裕生さんの記事参照)もあります。 また、SQLの埋め込み言語にTclの構文が使える PL/Tclもあります。 (*6) Plamo LinuxにおけるPostgreSQLについては 12月号で紹介しましたが、言語インターフェース は~postgres/examples/interfaces/の下のそれぞ れのディレクトリに展開されます。Plamo Linux については、 http://www.linet.gr.jp/~kojima/Plamo/ を参照 下さい。FTP サイトは ftp://ftp.linet.gr.jp/pub/Plamo/ にあります。 また、技術評論社のサイトにもあります。 ftp://ftp.gihyo.co.jp/pub/Plamo/ (*7) PlamoではPython-1.5.1がcontrib/Develop に納められてます。 (*8) Plamoではruby-1.1c2がcontrib/Developに 納められてます。 参考文献 [1]増永良文、「リレーショナル・データベース入門」、 サイエンス社、1991、(ISBN-4-7819-0594-3) [2]石井達夫、「WWW活用術」、 ComputerToday、1995-5,p36 [3] マイケル・ストーンブレーカー、 "OBJECT-RELATIONAL DBMSs THE NEXT GREAT WAVE"、 邦訳「オブジェクトリレーショナルDBMSs」、 インターナショナル・トムソン・パブリッシング・ジャパン /株式会社ビーエヌエヌ、 1996、(ISBN4-89369-436-7) [4] 「簡単システム構築術」、 SoftwareDesign、1998-12 [5]石井達夫、「PostgreSQL完全後略ガイド」、 技術評論社、1999、(ISBN4-7741-0714-4)