オブジェクト関係マッピング(ORM)とは
オブジェクト関係マッピング(Object-Relational Mapping, ORM)は、
オブジェクト指向プログラミング言語と関係
データベースの間で、データの不整合を解消するためのプログラミング技術です。
オブジェクト指向プログラミングでは、複雑なデータ構造を持つオブジェクトを扱いますが、関係
データベースはスカラー値のみを扱います。このため、オブジェクトを
データベースに保存したり、
データベースから読み込んだりする際に、データ形式の変換が必要になります。ORMは、この変換を自動化し、開発者がデータアクセス層を意識することなく、
オブジェクト指向の概念でデータ操作を行えるようにします。
背景
オブジェクト指向プログラミングでは、データはオブジェクトとして表現され、それぞれのオブジェクトは属性とメソッドを持ちます。例えば、「人物オブジェクト」は、名前、電話番号リスト、住所リストなどの属性を持つことができます。一方、関係
データベースは、データを表形式で格納し、各列はスカラー値を持ちます。この違いが、
オブジェクト指向プログラミングと関係
データベース間のデータ不整合問題を引き起こします。
この問題を解決するために、開発者は、オブジェクトを
データベースに保存可能な形式に変換するか、プログラムを
データベースに合わせて単純な値だけを扱うようにする必要があります。ORMは、前者、すなわちオブジェクトを
データベースに保存可能な形式に変換し、その関係性を保持する方法を提供します。これにより、開発者は、
データベースの構造を意識することなく、
オブジェクト指向の概念でデータ操作を行うことが可能になります。
ORMの
実装は、オブジェクトと
データベースの表を対応付け、必要な
SQLクエリを自動生成することで行われます。例えば、「人物オブジェクト」を
データベースに保存する場合、ORMは、人物の属性に対応する表にデータを挿入する
SQL文を生成します。また、「人物オブジェクト」の電話番号リストを取得する場合は、ORMは、関連する電話番号表からデータを取得し、電話番号オブジェクトのリストに変換します。ORMは、これらの変換を自動的に行うことで、開発者の負担を軽減します。
ORMの
実装を支援するために、多くのライブラリやフレームワークが提供されています。これらのツールは、マッピングを自動化し、開発者がよりビジネスロジックに集中できるようにします。しかし、ORMは完全に透過的ではありません。特に、複雑な
クエリを処理する場合や、大量のデータを扱う場合、ORMが生成する
SQLが非効率になることがあります。そのため、ORMの仕組みを理解し、必要に応じて
SQLを最適化することが重要です。
様々なORMシステム
様々なORMシステムが開発されており、それぞれ特徴があります。
NeXT Enterprise Objects Framework (EOF): かつてNeXT社で開発されたORMフレームワークで、後にAppleに買収され、macOSのCore DataやWebObjectsに統合されました。現在はオープンソースのApache Cayenneに影響を与えています。
Java Data Objects (JDO):
Java向けのORMの標準規格で、複数のベンダーが
実装を提供しています。EJB3とも競合関係にありましたが、現在では
Hibernateなどのフレームワークが主流になっています。
Hibernate: Javaで広く利用されているORMフレームワークで、JPA(Java Persistence API)に準拠しています。柔軟な設定が可能で、多様なデータベースに対応しています。
Active Record:
Ruby on Railsで採用されているデザインパターンで、
データベースのテーブルとオブジェクトをマッピングします。簡単な設定で、迅速な開発を可能にします。
*
DBIx::Class:
PerlのCatalystフレームワークで利用されるORMモジュールで、Active Recordと同様の役割を果たします。
Cachéなどの
データベースは、
SQL以外の方法でデータにアクセスできます。そのため、ORMは不要です。また、オブジェクト
データベースは、オブジェクトをそのまま格納できるため、
SQLによる変換が不要です。しかし、オブジェクト
データベースは広く利用されていません。これは、関係
データベースからオブジェクト
データベースへの移行コストや、
SQLによる
クエリの利便性が失われるためです。
批評
ORMは、
オブジェクト指向と関係モデルの不整合という根本的な問題に対する対症療法に過ぎないという批判もあります。
オブジェクト指向モデルはデータ操作には不十分であり、
パラダイム全体に問題があるという指摘もあります。また、現在のORMのマッピングが間違っており、型とオブジェクトを対応させるべきという意見もあります。
まとめ
ORMは、
オブジェクト指向プログラミングと関係
データベース間のデータ不整合を解消する便利な技術ですが、完全に透過的ではありません。ORMを最大限に活用するためには、その仕組みを理解し、適切な設定を行う必要があります。また、
データベースのパフォーマンスを考慮し、必要に応じて
SQLを最適化することも重要です。
ORMの利用は、開発効率を向上させ、データアクセス層を抽象化する上で有用ですが、その限界も理解しておくことが大切です。