PostgreSQLをMySQL互換にする
PostgreSQLの開発者Kings-Lynne――phpPgAdminプロジェクトにも参加している――が、PostgreSQL・MySQL互換プロジェクトに取り組んでいる。MySQLデータベースにのみ対応するソフトウェアでPostgreSQLを使えるようにしようというのだ。MySQLの関数100種と集計機能2種の作成を予定しており、「多分、PostgreSQL上のテンプレート」も含まれるだろうという。
Kings-Lynne自身の言葉によると、このプロジェクトは同氏の個人的関心を端緒とするもので、「SQLのストアド・プロシージャの作成技術を磨くための」場として、また「PostgreSQLがオープンソース・データベースの第1選択肢となるのを見たい」という願いから立ち上げたのだという。
MySQL互換関数が目標としているのは、MediaWiki、Drupal、SugarCRM、Bugzilla、Joomla!などのオープンソース・アプリケーションだ。「大規模なMySQLオープンソース製品でPostgreSQLが使えるようにしたいのです。そうした製品の(PostgreSQLへの)対応はまちまちなんですよ。これができれば、企業のWeb開発部門はPostgreSQLに移行しやすくなります。互換ライブラリがあることを示せば、MySQLからPostgreSQLへの移行を上司に説明しやすくなるでしょ?」
プロジェクトの現行バージョンはMySQL 5.xとの互換性を目指しているが、これには「おそらく」PostgreSQL 8.x以上が必要になるだろうという。この記事の執筆時点では、互換ライブラリは第2ベータ・リリースの段階にあり、1.0バージョンのリリースは間もなくだ。
「アプリケーションがPostgreSQLをサポートするよう、促す必要があります。このライブラリがあればサポートは簡単になりますし、PostgreSQLのストアド・プロシージャ言語を覚える必要もありません。PostgreSQLはMySQLのほとんどの関数を楽々と実装できるだけの地力があります。それを使わない手はないですよね」
Kings-Lynneによれば、一つのPostgreSQLサーバー上で通常のPostgreSQLデータベースとMySQL互換関数を用いたデータベースが併存しても問題はないという。「PostgreSQLのソースコードを変更することはありませんし、パッチを当てることもありません。実装は、すべてユーザー側の世界で行っていますから」
互換関数はデータベースにロードされ、そのデータベース上にのみ存在する。PostgreSQLのパフォーマンスにも、まったく影響はないという。
ただし、若干の制約があり、最初のリリースでは提供されないものがある。MySQL関数の中には、「PostgreSQLの文法を変える必要がある」ためサポートの困難なものがあるのだという。たとえば、MySQLにはブーリアン型がない、NULLの扱い方がPostgreSQLと異なる、文字列の大文字小文字を区別しないなど。その他の制約も含め、MySQLとPostgreSQL間の非互換性はプロジェクトのREADMEファイルに列挙されている。Kings-Lynneによれば、回避策はあり、将来のバージョンでこうした問題を解決する予定だという。
互換関数か、ネイティブ・サポートか
ところで、PostgreSQLのサポートを追加するのではなく、互換関数という形にするのはなぜなのだろうか。PostgreSQLのコアメンバーBerkusは、各プロジェクトがPostgreSQLをネイティブ・サポートしてくれる方がありがたいが、そうはなりそうもないと言う。「考えてもみてください。SourceForgeには、MySQL 4の機能さえサポートしていないWebプロジェクトが1,000ほどもあるんです。しかも、その多くはたった一人の開発者が自分の休みの時間を割いて作業をしています。そこにさらに別のデータベース・システムをサポートしてくれと頼んだとしても、笑われるのが落ちでしょう」
Kings-Lynneは、MySQLだけを念頭に置いてきたプロジェクトがPostgreSQLのサポートを追加するのは難しいだろうと言う。「Webアプリケーションの世界にはちょっと悲しい現実があります。オープンソース・プロジェクトのほとんどすべてがMySQLだけを対象にして始まるのです。ほかのデータベースのことを考え始めるのは数年後のことで、その頃にはかなり困難な状態になっています」
PostgreSQLコミュニティもこうした状況を座視してきたわけではない。PostgreSQLを使いたい人のために、MySQLアプリケーションがPostgreSQLに対応しやすくする機能を追加している。Berkusは、複数のリレーショナル・データベース・エンジンのサポートを容易にするためにPostgreSQL 8.1リリースで追加された関数を例に出した。「Dennis BjorklundがMySQLのlast_insert_idに対応してLastval()関数を、Pavel StehuleがGreatest()関数とLeast()関数を追加しました。些細なことのように思えるでしょうが、移植作業というのは、こうしたところでつまずくものなのです」
また、MySQLの標準準拠が強化されていることも有利だという。「MySQL 5.0の『完全準拠モード』向けに作られたアプリケーションなら、とても簡単に移植できるでしょう」
しかし、最も大きな課題は解説書の不備だとBerkusは言う。「このコミュニティに本当に必要なのは、MySQLからの移植に関する、わかりやすく包括的で最新情報を盛り込んだ手順書です。細々したことからアーキテクチャまで、違いを網羅した解説書なのです。ユーザーにとっては、そうした情報の方が、山盛りのスクリプトや互換関数よりも役に立つでしょう。残念ながら、解説書の執筆や改訂よりもコードを書く方が遥かに面白い。だから、誰も解説書を作ろうとしないのです」
確かにMySQL互換関数は完全なソリューションではないかもしれない。しかし、好みのデータベースを使って多くのオープンソース・アプリケーションを使ってみたいと考えているPostgreSQLユーザーにとって、一つの回答ではある。
原文