【エンジニア初学者向け】SQLとORMの違いを比較してみた

IT

はじめに

研修のタスクで、クエリをかく機会があり、そのときに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();
中の人
中の人

他のデータベースとの関係性の定義はどうか?

リレーションの話ですが、こちらも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);
   }
中の人
中の人

複雑なクエリに関してどう?

どちらでもGoodです!

ただ、テーブル数が多くて複雑なデータベースは混乱するので、SQLのほうがいいかもです。

N+1問題はどう?

こちらは、SQLが最適です。

N+1問題はデータベースからデータを取り出す際に、大量のSQLが実行されて動作が重くなるという問題です。

N+1問題とは?原因と対処法を徹底解説!
この記事では、N+1問題を徹底に解説します。何が原因で起きているのか、またその対処法はどうしたら良いのかについて詳しく説明しています。N+1問題を解決する方法やN+1問題を発見するためのgemも覚えておきましょう。
中の人
中の人

取得したいデータだけに注目して、それを抽出したSQLが有効ですね。ORMでは対策が必要です。

SQLインジェクション対策に対してはどうか?

こちらはORMですね。

SQLインジェクションとは、Webアプリケーションの脆弱性を利用して、データベースに不正なSQL文を注入し、情報を不正に取得、改ざん、削除する攻撃手法のことです。

中の人
中の人

おわりに

SQLもORMもそれぞれ強みがありますよね。どちらをかけるにこしたことはないのでは思います。

PJTに関わっているメンバーの能力値やリリースまでの期間や予算やプロダクトとの相性などなど…..そのときの状況に応じて、ユースケースを考えながら使っていきたいですね。

コメント

タイトルとURLをコピーしました