はじめに
Zend FrameworkやSymphonyといったPHPで利用できるフレームワークが登場し、オブジェクト指向でWebアプリケーションを開発できるプラットフォームが整ってきました。また、Webアプリケーションを開発する際には、MySQLやPostgreSQLといったリレーショナルデータベースをデータの保存先として使う場合が多いと思います。
Webアプリケーションフレームワークとデータベースの橋渡しにORM(Object-Relational Mapping)を利用することで、データベーススキーマのメンテナンス性が向上し、Webアプリケーション側にSQLなどのデータベースに依存したコードを書かなくて済むようになります。
本記事では、PHPで利用できるORMライブラリの機能比較、ベンチマークを行い、アーキテクトが適切なORMライブラリを選定できるようになることを目的とします。
対象読者
- PHPの基本構文を理解し、データベースと連携するプログラムを書いたことがある方
ORMとは?
オブジェクト指向の概念とリレーショナルデータベースの概念を橋渡しする役割がORMです。オブジェクト指向とリレーショナルデータベースの相性はそれぞれの概念が異なるため、相性が良くありません。なぜなら、オブジェクト指向では、データをオブジェクトとして扱うのですが、リレーショナルデータベースではデータを2次元の表として扱うためギャップが生じてしまいます。ORMを利用することによって、オブジェクトとデータベース問い合わせの相互変換を行います。以下に、概念図を記載します。
ORMを利用しないでデータ取得を行う場合は、以下のようにSQLをハードコーディングし、結果データを配列として扱う必要があります。
// 顧客テーブルからIDが1のユーザ名を取得するSQLを発行 $row = mysql_query('SELECT user_name FROM customer WHERE id = 1'); // キーがuser_nameの情報を表示 print $row['user_name'];
ORMを利用した場合は以下のようにオブジェクトの操作だけで書けます。
// 顧客IDが1のオブジェクトを取得 $customer = Dctrine::getTable('Customer')->find(1); // ユーザ名を表示 print $customer->getName();
ORMの利点と欠点
ORMの利用には、利点もありますが欠点もあります。自分のプロジェクトにおいて利点と欠点を理解したうえで、ORMを導入するかどうか決定してください。
利点
- SQLの記述はORMが行うのでプログラマが記述するSQLを最小限にでき、ビジネスロジックのコーディングに集中できる
- PDT(PHP Development Tools)やPHPEclipseなどの統合開発環境でメソッドの補完を行うことができるので、スペルミスやAPIを調べる手間が省ける
- 可搬性が上がる。データベース固有の振る舞いを吸収するので、別のデータベースに移行する際にビジネスロジックの変更を少なくできる
欠点
- スキーマを変更するたびにORMクラスの再構築が必要になる場合がある
- ORM自体を実行するオーバーヘッドが増える