web-dev-qa-db-ja.com

オブジェクトリレーショナルマッピングフレームワークとは何ですか?

タイトルが言うように。 ORMフレームワークとは何ですか?

80
RCIX

ウィキペディアから

コンピューターソフトウェアのオブジェクトリレーショナルマッピング(ORM、O/RM、およびO/Rマッピング)は、リレーショナルデータベースとオブジェクト指向プログラミング言語の互換性のない型システム間でデータを変換するためのプログラミング手法です。これにより、事実上、プログラミング言語内から使用できる「仮想オブジェクトデータベース」が作成されます。一部のプログラマーは独自のORMツールを作成することを選択しますが、オブジェクトリレーショナルマッピングを実行する無料のパッケージと商用パッケージの両方が利用可能です。

コードで使用できるインターフェイスを提供するために、データストア(フラットファイル/ SQL /何でも)を抽象化するのに適しています。たとえば、(Railsで)usersテーブルで最初のユーザーを見つけるためにSQLを構築する代わりに、これを行うことができます。

User.first

これにより、usersテーブルの最初のユーザーの属性とともに、ユーザーモデルのインスタンスが返されます。

47
Codebeef

簡単な答えは、プログラミング言語のクラスでテーブルまたはストアドプロシージャをラップすることです。そのため、データベースとやり取りするSQLステートメントを記述する代わりに、オブジェクトのメソッドとプロパティを使用します。

言い換えれば、このようなものの代わりに:

String sql = "SELECT ... FROM persons WHERE id = 10"
DbCommand cmd = new DbCommand(connection, sql);
Result res = cmd.Execute();
String name = res[0]["FIRST_NAME"];

あなたはこのようなことをします:

Person p = repository.GetPerson(10);
String name = p.FirstName;

または同様のコード(ここでは多くのバリエーション)。一部のフレームワークでは、クラス自体の静的メソッドとして多くのコードを配置します。つまり、代わりに次のようなことができます。

Person p = Person.Get(10);

複雑なクエリシステムも実装しているものもあるため、これを行うことができます。

Person p = Person.Get(Person.Properties.Id == 10);

フレームワークは、このコードを可能にするものです。

今、利益。まず、SQLをロジックコードから隠します。これには、より多くのデータベースエンジンをより簡単にサポートできるという利点があります。たとえば、MS SQL ServerとOracleには一般的な関数の名前が異なり、日付の計算方法も異なるため、「過去24時間編集されたすべての人を取得する」クエリでは、これら2つのデータベースエンジンだけで異なるSQL構文が必要になる場合があります。この違いは、ロジックコードから取り除くことができます。

さらに、すべてのSQLを正しくする代わりに、ロジックの作成に集中できます。データベースと通信するために必要なすべての「配管」が含まれていないため、コードは通常、より読みやすくなります。

通常、データベースはリレーショナルモデルで機能します。テーブル(単純化:スプレッドシートのような)と、それらの間のリレーションシップ(1対1、1対多、多対多など)があります。たとえば、テーブルAにはテーブルBに多くの関連レコードがあります。それらからデータを行として取得できます(テーブル/テーブルから行を表す値のコレクション) ウィキペディアの詳細

最新のプログラミング言語はオブジェクトモデルを使用します。オブジェクトにはメソッド、属性(単純または複雑)などがあります。

ORMソフトウェアは、これらのモデル間の移行を行います。たとえば、テーブルBのすべての関連レコードをオブジェクトAの属性に配置します。この種のソフトウェアにより、オブジェクトプログラミング言語でリレーショナルデータベース(最も一般的な種類)を使用しやすくなります。

9
leafnode

ORM(オブジェクトリレーショナルマッパー)を使用すると、DBAL(データベース抽象化レイヤー)が並んでいます。したがって、これらが何であるかを知ることは、あなたが使用しているものとあなたが得る利点を知るために必要です。

DBAL(データベース抽象化レイヤー)

これは、コードとデータベースの間のレイヤーとして機能します。データベースに関係なく、記述されたコードは微調整を加えることで正常に機能します。

現在のプロジェクトで、MySQLが完全に成熟し、何らかの理由でデータベースをOracleに切り替える計画を立てている場合、MySQLを使用して、MySQLで記述したコードをOracleベースのクエリに書き換える必要があるとします。また、プロジェクト全体のクエリを書き換えることは退屈な作業です。

代わりに、DBALライブラリを使用する場合は、データベースの構成を切り替えて、プロジェクトが1日以内に稼働することを確認できます(多少の微調整が必​​要になる場合があります)。

ORM(オブジェクトリレーショナルマッパー)

オブジェクトリレーショナルマッピング(ORM)は、オブジェクト指向言語からリレーショナルデータベースにアクセスする手法(デザインパターン)です。

Symfonyのようなフレームワークを使用したことがある場合(PHP background)/ Hibernate(Java)から来ている場合)、これらに精通しているはずです。エンティティ

オブジェクト指向コンテキストでデータベースにアクセスし、オブジェクトロジックを変換するインターフェイスが必要なため、このインターフェイスはORMと呼ばれます。データへのアクセスを提供し、ビジネスルールを維持するオブジェクトで構成されます。

例えば。

class User{
    private $email;

    private $password;

    public function setEmail($email){
        $this->email = $email;
        return $this;
    }

    public function getEmail(){
        return $this->email;
    }


    public function setPassword($password){
        $this->password = $password;
        return $this;
    }

    public function getPassword(){
        return $this->password;
    }
}

/* To save User details you would do something like this */
$userObj = new User();
$userObj->setEmail('sanitizedEmail');
$userObj->setPassword('sanitizedPassword');
$userObj->save();

/* To fetch user details you would do something like this */
$userObj = new User();
$userDetails = $userObj->find($id);

例えば。 DoctrinePropelRedBean

6

[〜#〜] orm [〜#〜] は:

抽象化は、他の抽象化と同様に、生活を楽にします。

2
Chris Nicol

ウィキペディアから: http://en.wikipedia.org/wiki/Object-relational_mapping

コンピューターソフトウェアのオブジェクトリレーショナルマッピング(ORM、O/RM、およびO/Rマッピング)は、リレーショナルデータベースとオブジェクト指向プログラミング言語の互換性のない型システム間でデータを変換するためのプログラミング手法です。これにより、事実上、プログラミング言語内から使用できる「仮想オブジェクトデータベース」が作成されます。一部のプログラマーは独自のORMツールを作成することを選択しますが、オブジェクトリレーショナルマッピングを実行する無料のパッケージと商用パッケージの両方が利用可能です。

長所と短所ORMは、多くの場合、記述に必要なコードの量を減らし、ソフトウェアをより堅牢にします(プログラムのコード行が少ないほど、それらに含まれるエラーが少なくなります)。[1]。

O/Rマッピングを使用することには、コストと利点があります。たとえば、一部のO/Rマッピングツールは、データの一括削除中にうまく機能しません。ストアドプロシージャのパフォーマンスは向上する可能性がありますが、移植性はありません。

0
chikak

次のようなことができます(これはDoctrineコード)です:

$activeUsers = Doctrine::getTable('User')->createQuery('u')->addWhere('u.active = false');
foreach($activeUsers as $user)
{
   $user->active = true;
   $user->save();
}
0
miguelSantirso

オブジェクトリレーショナルマッピング(ORM)ライブラリは、データベーステーブルからドメインオブジェクトクラスへのこのマッピングを提供します。

0
Nanhe Kumar