はじめに
研修のタスクで、クエリをかく機会があり、そのときにORMの方が便利じゃね?っとおもいつつもSQLならではの良さってなんだろうとおもいこの記事をかいてみることにしました。
この記事の対象者
こんな方に読んでいただきたいです
- SQLとORMの違いを理解したい
- プロジェクトでどちらを採用するのがいいのかわからず悩んでいる
- そもそも、それぞれのメリット・デメリットを考慮したい
SQLとは
データベースを操作するための言語です。
SELECT * FROM employees WHERE department_id = 1;
データを取得・更新・追加・削除(CRUD)をかく言語になります
ORMとは
SQLをかかずにデータベースを操作するための技術のことです。Obeject-Relational-Mappingの頭文字をとっています。
p = Product.new
p.name = "Some Book"
puts p.name #=> "Some Book"
ORMの種類
ORMはそれぞれのプログラミング言語ごとに存在しています。
- Laravel:Eloquent ORM
- Ruby:Active Record
- Node.js:Sequalize ・Prisma
- Python:SQL Alchemy
- Go:Gen

データベースの情報を取得するのはバックエンド言語の役割です。それぞれの言語ごとにあっていいですね
いろいろな観点で比較してみる
それでは、SQLとORMを比較してみましょう。
SQLとORMどちらが自由度高いか?
これは、SQLだと思います。
- パフォーマンス最適化できる
- サブクエリが作成できる
インデックスをつくることができパフォーマンスをあげることができます
CREATE INDEX idx_employee_name ON employees(employee_name);
また、サブクエリを作成して別のクエリを含めることができます。
SELECT employee_name
FROM employees
WHERE department_id IN (
SELECT department_id FROM departments WHERE location = 'New York'
);
エンジニアの開発体験としてどうか?
ORMが優位だと思います。長いSQLを書くことなく、可読性をあげることができます。
// Userテーブルの、emailカラムのexample@example.comを取得
$user = User::where('email', 'example@example.com')->first();

個人的に、SQLは別言語としての感覚なので、他の言語(PHP)の中にSQLがあると違和感でてきますね
他のデータベースとの関係性の定義はどうか?
リレーションの話ですが、こちらもORMが優位だと思います。どっちを書きたいですか?
SELECT *
FROM users
LEFT JOIN profiles ON users.id = profiles.user_id
// Userとの1対1の関係を定義
public function user()
{
return $this->belongsTo(User::class);
}
// Profileとの1対1の関係を定義
public function profile()
{
return $this->hasOne(Profile::class);
}

2つのテーブルとの関係性なので、複雑性は少ないですがORMのほうが可読性は高いかなと思います
複雑なクエリに関してどう?
どちらでもGoodです!
ただ、テーブル数が多くて複雑なデータベースは混乱するので、SQLのほうがいいかもです。
N+1問題はどう?
こちらは、SQLが最適です。
N+1問題はデータベースからデータを取り出す際に、大量のSQLが実行されて動作が重くなるという問題です。


一回のクエリで、複数のリレーションが絡むと実行時間がおやおやとなってきますね
取得したいデータだけに注目して、それを抽出したSQLが有効ですね。ORMでは対策が必要です。
SQLインジェクション対策に対してはどうか?
こちらはORMですね。
SQLインジェクションとは、Webアプリケーションの脆弱性を利用して、データベースに不正なSQL文を注入し、情報を不正に取得、改ざん、削除する攻撃手法のことです。

SQLを直接かかないので、防げる点があげられるかなと思います
おわりに
SQLもORMもそれぞれ強みがありますよね。どちらをかけるにこしたことはないのでは思います。
PJTに関わっているメンバーの能力値やリリースまでの期間や予算やプロダクトとの相性などなど…..そのときの状況に応じて、ユースケースを考えながら使っていきたいですね。
コメント