ObectSquare

[技術情報]





PHP4 + PostgreSQL7 で構築する Web-DB 入門

第 2 回 〜PostgreSQL編〜


株式会社オージス総研
マーケティング企画部
山井 智博
▼ 目次
1.前回のつづき。
2.PostgreSQL ってなんですか?
3.PostgreSQL の特徴。
4.バージョン 7 の新機能。
5.テーブルを作成してみよう。
6.おわりに。


■ 1. 前回のつづき。

業務に情報処理技術者試験に追われ、挙句の果てには肺炎にかかってしまい、2 ヶ月ぶりの連載となってしまいました。楽しみにしていてくださった方、本当に申し訳ありませんでした。朝晩と冷え込む季節になってきましたが、くれぐれもお体は大事になさってください。(今月号が出るころには、もうすっかり冬ですね、、)

さて、前回は、スクリプト言語 PHP の魅力についてお話させていただきました。
もう一度整理しますと、

PHP は、HTML に埋め込み、サーバサイドで実行されるスクリプト言語。

PHP は、Web サーバ Apacheの DSO(動的共有オブジェクト)として実行させることにより、CGIよりも高速に動作する。(PHP で CGI プログラムを組むことも可能です)

<FORM><INPUT TYPE="text" NAME="hoge"></FORM> と記述するだけで、変数 $hoge が生成され、入力された値を取得できる。すなわち、フォームデータが簡単に取得可能である。

比較的小規模なアプリケーションの場合、J2EE で組むよりも、短期間で開発を行うことができる、かもしれない。

ということでした。

今回は、フリー(正確には BSDライセンス)の RDBMS である PostgreSQL について紹介させて頂こうと思います。
また、前回に引き続き、ソフトウェアは
▼ PHP4.0.5
▼ PostgreSQL7.1.2
を使用します。

それでは、早速、PostgreSQL の世界に足を踏み入れてみましょう。(2001/11/29)


■ 2.PostgreSQLってなんですか?

PostgreSQL とは、postgres という RDBMSに、いろいろな人たちが様々な改良と機能追加を行うことによって生み出されたデータベース・ソフトウェアです。

FAQ によれば、PostgreSQL は、Post-Gres-Q-L(ポスト-グレス-キュー-エル)と発音するのが正しく、また、実際にはポストグレスと呼ばれることが多いようです。

postgres は、カリフォルニア大学バークレイ校によって研究用の DBMS として生み出されました。
ただし、postgres の開発は、バージョン 4.2 を以って開発を打ち切られることになります。
というのも、もともと研究用のソフトウェアであったにもかかわらず、ユーザ数が増加し、維持やサポートの負担が大きくなったことがその理由でした。

そこで、開発を引き継いだのが、同校の大学院生 Andrew Yu 氏と Jolly Chen 氏です。
postgres は postgres95 としてリリースされ(ちょうど Windows95 が神がかり的な勢いで売れていたころの話です)、これが PostgreSQL の原型と言われています。

しかしながら、postgres の歴史に、再び危機が襲うことになります。
それは、Andrew Yu 氏と Jolly Chen 氏が卒業により、開発から手を引いたことです。

次に開発を引き継いだのが、Marc G.Fournier 氏を筆頭とした、現在の開発チームです。
この結果、postgres95 は PostgreSQL という名称に変更され、現在に至っています。
#ちなみに、「PostgreSQL」という名称は、メーリングリストによる投票によって決められたそうです

とまぁ、いろいろな紆余曲折があって、現在の PostgreSQL があるわけですね。

ちなみに、日本においては、postgres95のあたりから、『日本 PostgreSQL ユーザ会』の理事長である石井達夫氏を中心に熱心な普及活動が行われています。

さて、歴史についてはここまでとして、次章では PostgreSQL の特徴について説明したいと思います。


■ 3.PostgreSQLの特徴。

PostgreSQL の特徴としては、以下のような点が挙げられます。

無償で利用可能な RDBMS である
PostgreSQL は、BSD ライセンスに基づき配布されており、商用/非商用を問わず無償で使用できます。また、ソースコードも公開されています。
数多くのプラットフォームに対応
Linux, FreeBSD, NetBSD, OpenBSD, Solaris, HP-UX, AIX等、UNIX 系システムだけでなく、WindowsNT/2000(Cygwin利用)、Mac OS X でも動作します。
SQL92 のサブセットに準拠
PostgreSQL は、データベースの標準言語である SQL92の殆どの機能をサポートしています。
多彩なプログラミング言語へのインタフェースをサポート
PostgreSQL は、標準で以下の言語をサポートします。 # Python をサポートしてるのは渋いですね、、。

また、サードパーティからも各種インタフェースが用意されています。
安定したデータベース・エンジンを搭載
DBMS としては必須の条件と言える、データベースエンジンの安定性ですが、特に目立った問題は、この半年ばかりの使用では発見されませんでした。

また、FAQでは「(安定性に関し)他のデータベースと比較しても遜色がないことに自信を持っています」とあり、自信の程が窺えます。
クライアント/サーバ型アーキテクチャ
PostgreSQL では、データベースを利用するクライアントと、データベース・エンジンを提供するサーバが完全に独立しているため、クライアント側で必要となるライブラリが軽量になります。また、ネットワーク対応型の DBMSであるとも言えます。
強力なロック機構をサポート
PostgreSQL は、他の DBMS 同様、行レベルのロックおよびテーブルレベルのロックをサポートしています。
配列をサポート
伝統的な RDBMS で扱えるデータ型は、整数や実数、文字列などに限られていました。
PostgreSQL では、任意のデータ型(ユーザ定義型を含む)の配列を扱う事が可能です。
ユーザ定義関数をサポート
PostgreSQL では、C 言語、SQL 等を使用して、ユーザ定義の関数を作成することができます。
ユーザ・サポート体制
PostgreSQL は、無償で提供されているソフトウェアですので、これまでは他の大方の無償提供されているソフトウェアと同様、商用ソフトウェアのようなサポートは存在しませんでした。

しかし現在、日本では株式会社SRAが有償でサポートを行っています。こういった無償・無保証のソフトウェアのサポートがビジネスモデルとして成り立っていることについて、筆者は軽く驚かされました。深読みすれば、それだけ PostgreSQLのユーザが多いとも言えましょう。
※ 無償ソフトウェアの有償サポートとしては、Linux が有名ですね。
いかがでしょうか?

それほど、他の DBMS製品と比較し、目新しいものではないと思われるかもしれません。

しかしながら、これは言い換えれば、無償で提供されているソフトウェアであるにもかかわらず、他の有償の DBMS に遜色ないものであるとも言えるのではないでしょうか?


■ 4.バージョン 7 の新機能。

PostgreSQL の最新のバージョンである 7.1.X では、主に以下の機能が実装されました。
TOAST(The Oversized-Attribute Storage Technique)による、レコード長制限の撤廃
WAL(Write-Ahead Logging)トランザクション・ログの実装
外部結合(OUTER JOIN)への対応

ここでは、特に重要な TOAST と WAL について説明したいと思います。

▼ TOAST
バージョン 7.1 以前の PostgreSQL では、1 レコードのサイズに 8K バイトの制限がありました(ラージ・オブジェクトというデータ型――簡単に説明すると、実ファイルへのポインタ――を使用することで、8K を超えるデータを扱うことは可能でしたが)。

このため、メールのデータを扱うようなシステム(メールベースのバグトラッキングシステム等)には不向きであると判断していたのですが、今回の TOAST の実装により、1 レコードの 1 列あたり最大 1GB までのデータを扱えるようになりました。

▼ WAL
今回のバージョンアップの最大の目玉が、この WALの実装です。

バージョン 7.1 以前の PostgreSQLでは、commit が発行された時点でハード・ディスクに書き込みを行っていました(同期モード)。
この方法は、データの信頼性は保障されるものの、データが更新される都度にディスクアクセスが発生するため、他の DBMS と比較した場合、お世辞にも速いとは言えませんでした。

最新バージョンでは、データへのアクセスはメモリ上に展開されたテーブル(インデックスを含む)に対して行われるため、高速化が実現されました。
更新されたデータのハード・ディスクへの書き込みは、後から、非同期で行われます。
ただし、これによって高速化は保障されたものの、信頼性には欠けることになってしまいます。

そこで実装されたのが、WAL と呼ばれるトランザクション・ログです。
WAL は、COMMIT と同期してハードディスクに書き込まれるため、もし何らかの障害によりシステムが停止したとしても、ハードディスクに保存されているテーブルと WALにより、システム停止前の状態にまで復元することが可能です。

ただし、トランザクション・ログが実装されたものの、undo 機能については未だ実装されていません。
これについては、次バージョンに期待といったところでしょうか。

なお、WAL とテーブルの、メモリおよびハードディスクへの書き込みを図示すると、以下の様になります。

WAL とテーブルの、記憶装置への書き込みについて


■ 5.テーブルを作成してみよう。

それでは、実際にテーブルを作成してみましょう。
テーブルの作成には、createdb コマンドを使用します。

$ createdb test
CREATE DATABASE

以上でデータベースが完成しました。あっけないくらい、簡単ですね。
例では、test というデータベースを作成しています。

それでは、一応、データベースが作成されていることを、確認してみましょう。

$ psql -l
     List of databases
 Database  |  Owner   | Encoding
-----------+----------+----------
 template0 | postgres | EUC_JP
 template1 | postgres | EUC_JP
 test      | yamai    | EUC_JP
(3 rows)

最後の行に、「test」というデータベースが作成されていることが確認できますね。

次にデータベース「test」の中に、アドレス帳テーブルを作成することにしましょう。

なお、先ほども使用しましたが、PostgreSQL では、psql というインタプリタを使用して、データベースを操作することになります。
※ Oracle で言うところの SQL*Plus みたいなものです。

まず、データベースに接続します。

$ psql test
Welcome to psql, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms
    \h for help with SQL commands
    \? for help on internal slash commands
    \g or terminate with semicolon to execute query
    \q to quit

test=>

次に、以下のようなテーブルを作成してみましょう。
# 主キーすらない、やっつけテーブルですが、、。

アドレス帳のスキーマ

テーブルの作成は、CREATE TABLE でしたね。

test=> CREATE TABLE address_book (
test(> name text,
test(> address text,
test(> phone_number text );
CREATE

それでは、作成したテーブル「address_book」のスキーマ情報を取得してみましょう。
スキーマ情報を取得するには、\d コマンドを使用します。

test=> \d
        List of relations
     Name     | Type  |  Owner
--------------+-------+----------
 address_book | table | yamai
(1 row)

test=> \d address_book
      Table "address_book"
  Attribute   | Type | Modifier
--------------+------+----------
 name         | text |
 address      | text |
 phone_number | text |

早速、作成した「address_book」テーブルに、レコードを挿入してみましょう。
レコードの追加は、INSERT 文ですね。

test=> INSERT INTO address_book VALUES ('ヤマイ@カリスマ末端社員',
test(> '新潟県刈羽郡小国町チャーザー村 ニコニコ寮','12-3456-7890');
INSERT 230799 1

それでは、早速、SELECT文を発行して、挿入したレコードを確認してみましょう。

test=> SELECT * FROM address_book;
           name           |                  address                  | phone_number
--------------------------+-------------------------------------------+--------------
 ヤマイ@カリスマ末端社員 | 新潟県刈羽郡小国町チャーザー村 ニコニコ寮 | 12-3456-7890
(1 row)
※ 笑点のこん平師匠でおなじみの「チャーザー村」ですが、正確には「千谷沢」(現在は村ではない)といいます。
※ 全く関係ありませんが、私の田舎は、新潟県のお隣です。


以上でデータベースの作成、テーブルの作成、テーブルへのレコードの挿入と、簡単なデータベースが作成されました。

いかがだったでしょうか?
あまりにも簡単すぎて、「つまらない」という声が聞こえて来そうですが、、。


■ 6. おわりに。

さて、今回はフリーの RDBMS、PostgreSQL の紹介をさせて頂きましたが、いかがだったでしょうか?

正直、このソフトウェアの魅力をうまくお伝えできたかについては自信がありません。
それは、他の RDBMS と比較して、特徴として押せるだけのポイントを私が見出せなかったのが理由だと思います。

ただし、これは先にも述べたとおり、言い換えれば無償で提供されているにもかかわらず、他の商用 DBMSと比較し、何ら遜色のないソフトウェアであると言えるのではないでしょうか?

例えば、商用 DBMSの代表格である Oracle で、Web-DB アプリケーションを構築しようとした場合、安価な Linux 版でも、ライセンス料だけで 100 万円近くかかってしまいます。これでは、お手軽さに欠けます。
その点、PostgreSQLは無償で利用できるわけですから、これは充分魅力的ですね。

次回は最終回ということで、いよいよ PHPと PostgreSQLの連携について書いてみたいと思います。
PHPと PostgreSQL の連携については、実際にアプリケーション「ハイパー住所録」を作成しながら説明させていただく予定です。
果たして、何が「ハイパー」なのか、謎は深まるばかりですが。

それでは、また次回、お目にかかりましょう。

adios !!


▼ 参考文献
『PC UNIXユーザのための PostgreSQL完全攻略ガイド』 技術評論社 1999年
『PHP4でカンタンWebDB構築ガイド』 秀和システム 2001年
▼ 参考リンク
PostgreSQL 本家(英語)
日本 PostgreSQL ユーザ会
PostgreSQL 7.1.3 ドキュメント
PHP 公式Webサイト(英語)
日本 PHP ユーザ会
Apache 公式Webサイト(英語)



© 2001 OGIS-RI Co., Ltd.
Prev. Index Next
Prev. Index Next.