目次
- ORMとは
- NO ORM vs ORM
- ORMの利点と欠点
ORMとは?
オブジェクト関係マッピング(ORM、Object-Relational Mapping)は、オブジェクト指向プログラミングと関係データベースの互換性を向上させるために設計されたプログラミング技術です。ORMの基本的な構造は、プログラミング言語のクラスとデータベースのテーブルをマッピングすることから始めます。これにより、エンジニアは直接SQLクエリの作成することなく、ORMを通じてデータベースと相互作用できます。
NO ORM vs ORM
実際、どういう意味なのかは具体的な例を見れば分かりやすいと思います。 まず、簡単な2つの例を見ながら違いを感じてみてください。
ORMを使わない例 - 直接データベース操作
users = Array.new
sql = "SELECT * FROM users"
rows = some_sql_module.query(sql); # `some_sql_module`は簡略化された例
rows.each do |row|
user = User.new;
user.id = row[:id] # シンボルがカラム名として使用されると仮定
user.name = row[:name]
user.email = row[:email]
users << user
end
このコードは、Rubyでデータベースからユーザーのリストを取得する例です。
sql
変数にはSQLクエリが格納されており、some_sql_module.query(sql)
を使ってデータベースからデータを取得します。取得された各行は、新しい User オブジェクトにマッピングされ、そのオブジェクトの各属性(id
、name
、email
)がデータベースのカラムに対応します。最後に、ユーザーのオブジェクトを users
配列に追加します。このコードは、ORMなしでデータベース操作を行う典型的な例です。
上記のコードをRailsのORM、ActiveRecordを使用すると、同じ操作が極めて簡単になります。クエリの全てが抽象化され、以下の1行で実行できます。次の例を見てください。
ORMを使う例 - RailsのActiveRecord
users = User.all
この1行のコードは、上記のRubyコードで行っていた操作と同じですが、RailsのActiveRecordを使用しています。ここでは、User.all
メソッドを呼び出すだけで、データベースから全てのユーザーを取得し、Userオブジェクトの配列として users
変数に格納します。
上記の2つの例を絵で構造化して表現してみましょう。
このシンプルな例からも、ORMを使うことで、データベースとの対話がどれだけ簡単かがわかります。コードの可読性が上がり、保守も容易になります。しかし、ORMはあくまで抽象化のレイヤーなので、特別なケースや最適化が必要な場合は、直接SQLを書く必要があることもあります。
ORMの利点と欠点
今までORMが何なのか具体的に見てきました。 それではここでORMの利点と欠点を簡単に整理します。
利点
- コードの再利用性: モデルクラスを通じたデータ定義により、コードの再利用と保守が容易になります。
- 開発効率の向上: 自動化されたクエリ生成により、開発時間の短縮とデータベース操作の簡素化が可能です。
- データベース独立性: 抽象化されたレイヤーを提供することで、異なるデータベースへの移行が容易になります。
- オブジェクト指向的なアプローチ: オブジェクト指向プログラミングの特性をそのまま活用できます。
欠点
- 学習曲線: 特定のORMライブラリの使用法と動作方式を学ぶ必要があります。
- 複雑なクエリの問題: 非常に複雑なクエリを扱う場合、直接SQLを使用する必要があります。
- パフォーマンス問題: ORMの内部動作やクエリの最適化失敗などからパフォーマンスの問題が発生することがあります。
まとめ
ORMは開発の効率を向上させ、コードの再利用性を高める重要なツールですが、全てのプロジェクトに適合するわけではありません。その特性と制約を正確に理解し、プロジェクトのニーズと合致するかを慎重に評価することが重要です。この記事が少しでもORMの概念を理解するのに役立つことを願っています。
参考文献
- Rochester Institute of Technology, ORMs, https://www.se.rit.edu/~swen-344/slides/DB/rabb/03.5-ORMs.pptx