web-dev-qa-db-ja.com

ORMとは何ですか、それはどのように機能し、どのように使用する必要がありますか?

誰かが、私が設計しているプロジェクトにORMを使用することを提案しましたが、それが何であるか、またはどのように機能するかについての情報を見つけるのに苦労しています。

ORMとは何か、どのように機能し、ORMの使用を開始する方法について簡単に説明できますか?

230
Ryan

前書き

オブジェクトリレーショナルマッピング (ORM)は、オブジェクト指向のパラダイムを使用して、データベースのデータをクエリおよび操作できる技術です。 ORMについて話すとき、ほとんどの人はオブジェクトリレーショナルマッピング手法を実装するlibraryを参照しているため、「an ORM」というフレーズが使用されます。

ORMライブラリは、選択した言語で記述された完全に普通のライブラリであり、データを操作するために必要なコードをカプセル化するため、SQLはもう使用しません。使用しているのと同じ言語のオブジェクトと直接やり取りします。

たとえば、疑似言語を使用した完全に架空のケースを次に示します。

本のクラスがあり、著者が「Linus」であるすべての本を取得したい場合。手動で、あなたはそのようなことをするでしょう:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

ORMライブラリを使用すると、次のようになります。

book_list = BookTable.query(author="Linus");

機械部品は、ORMライブラリを介して自動的に処理されます。

長所と短所

ORMを使用すると、次の理由で時間を大幅に節約できます:

  • DRY :データモデルを1か所に記述するだけで、コードの更新、保守、再利用が簡単になります。
  • データベース処理から I18N まで、多くの処理が自動的に行われます。
  • MVC コードを強制的に記述します。これにより、最終的にコードが少しきれいになります。
  • 不完全な形式のSQLを書く必要はありません(SQLは実際には非常に強力で複雑なものですが、SQLは「サブ」言語のように扱われるため、ほとんどのWebプログラマーは本当にそれを嫌います)。
  • 消毒;準備されたステートメントまたはトランザクションの使用は、メソッドの呼び出しと同じくらい簡単です。

ORMライブラリの使用は、次の理由により柔軟性があります:

  • それはあなたの自然なコーディング方法に合っています(あなたの言語です!)。
  • DBシステムを抽象化するため、いつでも変更できます。
  • モデルはアプリケーションの他の部分に弱くバインドされているため、変更したり、他の場所で使用したりできます。
  • これにより、データ継承のようなOOPの良さを頭痛なく使用できます。

しかし、ORMは痛みになる可能性があります:

  • それを学ぶ必要があり、ORMライブラリは軽量のツールではありません。
  • 設定する必要があります。同じ問題。
  • 通常のクエリではパフォーマンスは問題ありませんが、SQLマスターは、大規模なプロジェクトでは常に自分のSQLを使用してより良い結果を出します。
  • DBを抽象化します。舞台裏で何が起こっているかを知っていても問題ありませんが、forループでの大ヒットのように、非常に貪欲なステートメントを書くことができる新しいプログラマーのtrapです。

ORMについて学ぶには?

さて、使用してください。どちらのORMライブラリを選択しても、それらはすべて同じ原則を使用します。ここには多くのORMライブラリがあります。

WebプログラミングでORMライブラリを試してみたい場合は、次のようなフレームワークスタック全体を使用することをお勧めします。

  • Symfony (PHP、PropelまたはDoctrineを使用)。
  • Django (Python、内部ORMを使用)。

何かを学ぼうとしているのでない限り、独自のORMを書こうとしないでください。これは巨大な作業であり、古いものは信頼できるようになるまでに多くの時間と作業を要しました。

483
e-satis

誰でも簡単な説明をくれますか...

確かに。

ORMは「Object to Relational Mapping」の略で、ここで

  • Object部分は、プログラミング言語で使用する部分です(この場合はpython)

  • Relationalの部分はリレーショナルデータベースマネージャーシステム(データベース)です。他の種類のデータベースもありますが、最も一般的なのはリレーショナルです(テーブル、列、pk fkなど、Oracle MySQL、MS- SQL)

  • 最後に、マッピングの部分は、オブジェクトとテーブルの間の橋渡しをする場所です。

ORMフレームワークを使用しないアプリケーションでは、これを手作業で行います。 ORMフレームワークを使用すると、ソリューションの作成に必要なボイラープレートを減らすことができます。

このオブジェクトがあるとしましょう。

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

そしてテーブル

   create table employee(
          name varcar(10),
          -- etc  
    )

ORMフレームワークを使用すると、そのオブジェクトをdbレコードに自動的にマッピングし、次のように記述できます。

   emp = Employee("Ryan")

   orm.save( emp )

そして、従業員をDBに挿入します。

おっと、それはそれほど簡単ではありませんでしたが、あなたが読んだ他の記事を簡単にキャッチできることを願っています。

50
OscarRyz

ORM(オブジェクトリレーショナルマッパー)は、コードオブジェクトをデータベースにマップするのに役立つソフトウェアの一部/レイヤーです。

一部のものは他のものよりも多くの側面を処理します...しかし、目的は、開発者の肩からデータ層の重みを取り除くことです。

以下は、Martin Fowler(データマッパー)の簡単なクリップです。

エンタープライズアプリケーションアーキテクチャデータマッパーのパターン

17
Justin Niessner

すべての頭字語と同様に曖昧ですが、私は object-relational mapper -が目を覆い、その下にSQLが存在しないと信じる方法を意味すると仮定します;-)。もちろん、本当ではなく、問題もありません。常にカラフルなジェフアトウッドは、ORMを CSのベトナム ;-)と表現しています。しかし、SQLをほとんどまたはまったく知らず、非常に単純で小規模な問題がある場合、時間を節約できます!-)

4
Alex Martelli

オブジェクトモデルは、次の3つの概念に関係します。データ抽象化カプセル化の継承リレーショナルモデルは、リレーションまたはテーブルの基本概念を使用しました。オブジェクトリレーショナルマッピング(ORマッピング)製品は、オブジェクトプログラミング言語の機能をリレーショナルデータベースと統合します。

2
Hamza Riaz

Storm は、Pythonを使用している人に最適なオプションです。

2

これは大きなトピックです。良い休止状態の本を手に入れてください。それは、非常にざらざらした休止状態の資料に到達する前に、ORMを詳細に説明する必要があります。

https://www.hibernate.org/

2
Stefan Kendall

DALMP http://code.google.com/p/dalmp/ は、現在redis/memcache/apcのような多くのキャッシュバックエンドをサポートしているphp/mysqlに適している可能性があります

1
tareco