オブジェクトリレーショナルマッピング (ORM) とは
オブジェクトリレーショナルマッピング (ORM) とは
オブジェクトリレーショナルマッピング (ORM) は、プログラミング言語のエンティティ (オブジェクト) とそれに対応するデータベース要素との関係を抽象化するプロセスです。
アプリケーションを構築する際、プログラマーは現実世界の概念に対応するオブジェクトをコードで定義します。オブジェクトデータはコード内で操作されますが、データシステム設計の定義に従ってデータベースに保存されます。たとえば、コード内に顧客情報を含む顧客オブジェクトがある場合でも、基盤となるデータベースではそのデータを複数のテーブルに保存できます。
オブジェクトリレーショナルマッピングは、オブジェクトデータを基盤となるデータベースに変換するソフトウェアレイヤーであり、プログラマーからのデータベースの詳細を抽象化します。これにより、基盤となるデータベースが新しい設計や異なる設計に置き換えられても、コードは変更せずに済みます。オブジェクトリレーショナルマッピングにより、管理と保守が容易なモジュール型アプリケーションを作成できます。
オブジェクトリレーショナルマッピングの仕組み
オブジェクトリレーショナルマッピング (ORM) は、オブジェクト指向プログラミング (OOP) 言語で記述されたアプリケーションを基盤となるデータベースに接続します。多くの場合、これらのタイプのアプリケーションとデータベースは一緒に使用されますが、データの処理方法はそれぞれ異なります。これらの間にオブジェクトリレーショナルマッピングを追加すると、互いに相手が理解する形式でデータを送信できるようになります。一方を修正しても、他方に影響を与えません。
オブジェクト指向プログラミング言語
OOP 言語は、データをオブジェクトに整理します。オブジェクトは、1 つ以上の属性を持つコード構造です。例えば、OOP アプリケーションでは、車などのデータ永続クラスとして表されるオブジェクトを、メーカー、モデル、VIN、色、走行距離などの属性を使用して定義できます。
よく使用されているオブジェクト指向プログラミング (OOP) 言語には、Python、Java、JavaScript、.NET/C# などがあります。
リレーショナルデータベース
リレーショナルデータベースは、連結された一連のスプレッドシートと同様に、データをテーブルに構造化します。各テーブルは、固有のレコードが各行に入力された列のセットで構成されています。
例えば、車のデータベースに複数のテーブルがあるとします。あるテーブルには、メーカー、モデル、VIN などのブランドデータが含まれます。 別のテーブルには、所有者、色、走行距離など、個々の車の属性が格納されます。よく使用されているリレーショナルデータベースには、 MySQL、PostgreSQL、SQL Server などがあります。
Web 開発では、オブジェクトリレーショナルマッピング (ORM) ツールを用いて、オブジェクト指向アプリケーションから送信されたデータをリレーショナルデータベースに変換します。アプリケーションがデータベース内でそのデータがどのように構造化されているかを知る必要はありません。
オブジェクトリレーショナルマッピング
オブジェクトリレーショナルマッピングは、オブジェクトリレーショナルマネージャーとも呼ばれることがあり、構造ごとにデータの格納方法が異なる場合でも、アプリケーションが要求するすべてのデータの配置場所をデータベースに指示します。アプリケーションが個々の車のすべての属性を要求した場合、ORM は複数のテーブルにわたるすべてのデータを取得する方法をデータベースに指示します。
マッピングは抽象化されているため、データベース構造が変更されたり、新しいデータベースに移行したりしても、ORM は最小限の更新で正しいデータを示すことができます。
一般的な ORM フレームワーク
ORM ツール、またはフレームワークは、よく使用されているオブジェクト指向プログラミング言語の多くでデータモデリングに使用できます。よく使用されているフレームワークは以下のとおりです。
- Java 用 Hibernate
- Python 用 SQLAcademy
- .NET/C# 用 Entity Framework
ORM と ORDBMS の違い
オブジェクトリレーショナルデータベース管理システム (ORDBMS) は、リレーショナルフレームワークとオブジェクト指向フレームワークの両方の要素を使用するデータベースの一種です。OOP 言語でコーディングできるものと同様に、オブジェクトとして構造化されたレコードを保存できます。ただし、これらのレコードに対して SQL のようなリレーショナルクエリも実行できます。このような機能の組み合わせにより、標準のリレーショナルデータベースで利用可能なデータ型よりも幅広いデータ型を保存できます。
オブジェクトリレーショナルマッピング (ORM) がアプリケーションレベルで動作するデータ抽象化であるのに対し、ORDBMS はオブジェクト指向の機能をデータベースレベルで直接提供します。
ORM はアプリケーションコード内で実行され、バックグラウンドで SQL を生成します。ORDBMS は、高度なオブジェクトタイプをネイティブでサポートし、データベースレベルでデータストレージとクエリの実行を管理します。
ORM と SQL の違い
SQL (構造化クエリ言語) は、リレーショナルデータベースとのやり取りに使用される標準言語です。宣言型コマンドを使用して、データベーススキーマの作成と管理、データの挿入と更新、レコードのクエリを行うことができます。
SQL では、データベースを低レベルで直接制御できます。ORM は、より高レベルで抽象化されたインターフェイスを提供するため、多くの場合、開発が速くなり、コードがより保守しやすくなります。
ORM は、一般的なデータベースタスクを簡素化し、アプリケーションコードと整合させるのに最適ですが、パフォーマンスの調整、複雑なクエリ、またはデータアクセスの完全な制御が必要な場合は、SQL が依然として不可欠です。
SQL クエリの代わりに ORM を使う理由
SQL では、データベースを操作するために手動でコマンドを記述する必要がありますが、ORM はオブジェクト指向のコードをバックグラウンドで自動的に SQL に変換します。
ORM は、多数のデータベースクエリを実行しなければならないオブジェクト指向プログラムの開発に必要なコーディングの量を減らすのに役立ちます。保守が必要な多数のデータベースクエリを手動でプログラミングする代わりに、開発者は ORM にリクエストを送信する方法をプログラムします。
よりわかりやすいプログラミング言語で作業すると、コードの読みやすさとデバッグも簡単になります。
オブジェクトリレーショナルマッピングを使用する利点
ORM システムには次のような利点があります。
アプリケーション開発の迅速化
ORM を使用すると、開発者は、最も使い慣れた OOP 言語のわかりやすいコードを使用して複雑なデータを取得することができます。レコードの作成、読み取り、更新、削除 (CRUD) などの日常的なデータベース操作を処理できるため、開発者はアプリケーション内でこれらの操作を繰り返しコーディングする必要がありません。
アプリケーションメンテナンスの簡略化
ORM を使用してデータベースクエリを抽象化することで、開発者は単一の言語で作業できるため、コードの理解と保守が容易になります。
セキュリティの向上
SQL インジェクション攻撃は、アプリケーションのユーザーフォームを介して SQL クエリを送信することにより、プライベートデータにアクセスしようとする悪意のある攻撃です。ORM はパラメータ化されたクエリを使用します。最初にデータベースに、実際のデータではなくプレースホルダー値を含むクエリを送信します。 (例: ? または :param)。実際のデータは別で送信されます。これにより、ユーザー入力は実行可能な SQL コードではなくデータとして扱われます。したがって、ORM ツールを使用すると、SQL インジェクションによる不正なデータアクセスを防ぐことができます。
パフォーマンスの向上
ORM は、アプリケーション層で透過的なオブジェクトキャッシュを有効にすることで、システムパフォーマンスを向上させることができます。最も頻繁に取得されるデータをアプリケーションの近くに保存できるため、アクセスが速くなります。
オブジェクトリレーショナルマッピングを使用する際の課題
ORM には次のような課題があります。
インピーダンスのミスマッチ
複雑なデータ構造は、オブジェクト指向プログラムとデータベース間でマッピングするのが難しい場合があります。OOP でコーディングできる階層は、ORM がどれほど高度であっても、データベースで表現するのが非常に難しい場合があります。
複雑度が高い場合のパフォーマンス問題
データベースに直接クエリを実行する方が、ORM を使用するよりも計算効率が高くなります。非常に複雑なクエリの場合、オブジェクトリレーショナルマッピング (ORM) ツールを使用するよりも、SQL コードを使用した方が効率的な場合があります。
学習曲線
ORM を使用すると複雑な SQL コードを学習する必要がなくなりますが、開発者は ORM ツールの使い方を学習する必要があります。
オブジェクトリレーショナルマッピングを使用すべき状況
ORM ツールはデータベースクエリを抽象化して自動化するため、開発者は複雑なクエリをコーディングするよりも、アプリケーションにより多くの労力を集中させることができます。次の場合は ORM の使用を検討してください。
アプリケーションに多くのオブジェクトがある
複雑なオブジェクトインターフェイスや構造のクエリを手動で作成するのは、時間と労力がかかる作業です。データベースに保存されているデータにオブジェクトを ORM ツールでマップできるようにすると、正確な検索をより迅速かつ確実に行うことができます。
アプリケーションが同様のデータベースクエリを繰り返す
ORM は、多くの日常的な CRUD 操作 (データの作成、読み取り、更新、削除) を簡単に自動化できるため、必要な SQL コードが少なくなります。
スキーマの進化が進行中である
データモデルがまだ進化中である場合、ORM はデータベーススキーマの変更をより簡単に管理するのに役立ちます。多くの ORM には、構造化された方法で変更をバージョン管理して適用できる移行ツールが含まれており、環境間の不整合のリスクを軽減できます。
データベースの移植性が重要である
ORM は、アプリケーションによって呼び出される操作を特定のデータベースから意図的に分離する抽象化レイヤーです。完全な移植性を保証するものではありませんが、この抽象化によってシステム間の移動にかかる労力が軽減されます。そのため、例えば、自動車アプリケーションを MySQL データベースから PostgreSQL に切り替える必要がある場合でも、アプリケーション全体を書き直す必要はありません。テーブルが変更された場合は、ORM を少し調整するだけで済みます。
オブジェクトリレーショナルマッピングを使用すべきでない状況
オブジェクトリレーショナルマッパーは強力なツールですが、最適なソリューションとはならない状況もあります。
単純なデータベース操作の場合
単純な CRUD 操作のみを実行するアプリケーションを構築する場合、単にアプリケーション内で手動でクエリを管理するより、ORM の保守に要する時間と労力の方が多くなる可能性があります。
ハイパフォーマンスコンピューティングが不可欠な場合
多くのアプリケーションでは、ORM によって追加される追加の計算時間やリソースは関係ありません。しかし、ミリ秒単位が重要なリアルタイム分析のようなタスクでは、その差は受け入れられない場合があります。
非正規化されたスキーマを使用する必要がある場合
状況によっては、開発者がデータベース Web サービスの複数のテーブルにまたがる冗長データ (非正規化スキーマ) を維持したい場合があります。これにより、アプリケーションが多数のテーブルを結合する複雑なリレーショナルクエリを実行する必要がある場合のパフォーマンスを向上させることができます。これらのクエリを ORM にマッピングすることは必ずしも効果的ではありません。
AWS によるデータ管理要件の支援
AWS は、データ管理を効率的かつ費用対効果の高いものにするさまざまなクラウドデータベースソリューションを提供しています。
Amazon Relational Database Service (Amazon RDS) は、クラウド内でリレーショナルデータベースをより簡単にセットアップ、運用、スケーリングできるようにするマネージドサービスです。これにより、時間のかかるデータベース管理作業をお客様の代わりに実行して、お客様を管理業務から解放し、アプリケーションとビジネスに集中させることができます。このサービスはコスト効率もよく、データベース容量の変更にも柔軟に対応します。
Amazon Aurora は、高いパフォーマンスと高可用性を大規模に提供する最新のリレーショナルデータベースサービスです。完全にオープンソースの MySQL および PostgreSQL 互換エディションと、サーバーレスおよび機械学習 (ML) 主導のアプリケーションを構築するためのさまざまなデベロッパーツールを備えています。
Amazon Redshift は最新のデータ分析を大規模に強化し、他のクラウドデータウェアハウスと比較して最大 3 倍の料金パフォーマンスと 7 倍多いスループットを提供します。
Amazon DocumentDB (MongoDB 互換) は、JSON オブジェクトと同様のドキュメントにデータを格納する、高速でスケーラブルかつ高可用性のフルマネージド型エンタープライズドキュメントデータベースサービスです。ネイティブオブジェクトから返されたドライバを開発者が使用するプログラミング言語に利用するため、ORM ツールは不要です。
今すぐ無料アカウントを作成して、AWS でデータベースの使用を開始しましょう。