ORM概要
ORM (Object-Relational Mapping) は、プログラミングの上で、オブジェクト指向プログラミング(以下、OOP)とリレーショナルデータベース(以下、RDB)の連携を実現するプログラミング技法です。ORMを使用することで、データベースの操作を書く際にSQLを直接記述せずに、プログラム言語のオブジェクトを使用して操作を実現できます。
ORMをなぜ使うのか
OOPとRDB、これら2つがもつそれぞれのデータモデルに違いによって生じる、インピーダンスミスマッチを解消するためです。
RDBは基本的にはテーブル型のデータ構造に対し、OOPは基本的にクラス(データ+振る舞い)を階層型に持つことが多いです。
テーブルは、DBの考え方で最適化され、クラスはオブジェクト思考の考え方に沿って設計されることを考えると、二つの指向性には差異(インピーダンスミスマッチ)が生まれます。
ORMを使うには
モデルの定義
ORMでは、データベースの構造に対応するモデルを作成します。
例えば、ユーザー表は下記のようにモデルで表現されます。(例はRuby on Rails)
class User < ApplicationRecord
# 振る舞いなどの処理
end
以下、Ruby on RailsのORMライブラリであるActive Recordを例に説明します。
レコードの作成
新しいレコードを作成する際、Active RecordはSQLを自動生成します。
# 新しいユーザーを作成
user = User.new(name: "Alice", email: "alice@example.com")
user.save
# または、1行で作成
User.create(name: "Bob", email: "bob@example.com")
生成されるSQL例
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
レコードの取得
データベースからデータを取得するクエリも記述できます。
# 全てのユーザーを取得
users = User.all
# 特定の条件で取得
user = User.find_by(email: "alice@example.com")
生成されるSQL例
SELECT * FROM users WHERE email = 'alice@example.com' LIMIT 1;
レコードの更新
既存のデータを更新する場合
user = User.find(1)
user.update(name: "Alice Wonderland")
生成されるSQL例
UPDATE users SET name = 'Alice Wonderland' WHERE id = 1;
レコードの削除
データを削除する場合
user = User.find(1)
user.destroy
生成されるSQL例
DELETE FROM users WHERE id = 1;
ORMのメリットとデメリット
メリット
生産性の向上
SQLを直接書かずにオブジェクト指向のコードを書けるため、コード量が減り、読みやすくなります。
安全性の向上
直接SQL書かないため、SQLインジェクション攻撃などの脆弱性を減らすことができます。
デメリット
学習コスト
特定のORMライブラリの使用法と動作方法の両方を学ぶ必要があります。
複雑なクエリなどは実装できない場合がある
ORMの構造から外れた変更が必要な場合は直接SQLを書かざるを得ない場合もあります。
性能問題
ORMの内部動作やクエリの最適化失敗などからパフォーマンスの問題が発生することがあります。
終わりに
読んでいただきありがとうございました!
ORMは、データ操作を短時間で実装するための有力な手段ですが、クエリへの変換が上手くいってなかったりすることもあるため昨今ではORM不要論なども持ち上がっていたりします。
ORMを利用するか、直接クエリを書くかは開発プロジェクトによっても異なると思いますが、1手段として覚えておくのが良いかと思います。
参考文献