🤖
データベースを学ぶ #1 ORMs / ACID / Transactions / N+1 / Normalization / Failur
1. はじめに
今回はデータベースまわりの基礎〜中級知識を整理します。
「なんとなく知ってる」では済まされない要素ばかりなので、復習しながらチェックリスト的に見直していきましょう。
2. ORMs(Object-Relational Mappers)
- 目的: オブジェクトとRDBのテーブルをマッピングして操作を簡単にする
- 例: Laravel Eloquent、Django ORM、Hibernate
- メリット: SQLレスで保守性UP
- デメリット: 複雑クエリは遅くなる、SQL理解は結局必要
3. ACID(トランザクション特性)
- Atomicity(原子性): 成功か失敗かのどちらか
- Consistency(一貫性): データの整合性を守る
- Isolation(分離性): 同時実行でも干渉しない
- Durability(永続性): 成功した操作は永続的
4. Transactions(トランザクション)
- 複数のDB操作を「ひとまとまり」で扱う仕組み
- 例: 銀行送金(引き落とし + 入金)
- 失敗時: ROLLBACK
- 成功時: COMMIT
5. N+1 Problem
- 現象: 親を取った後に子をループで呼ぶと追加クエリが大量発生
-
例:
User::all()
→ 各ユーザーのposts
を個別にSELECT -
解決策: Eager Loading(Laravelなら
with()
)、JOIN
6. Normalization(正規化)
- 目的: データの重複や矛盾を防ぐ
- 第1正規形: 繰り返し排除(1セルに1値)
- 第2正規形: 主キーに完全従属
- 第3正規形: 推移的従属を排除
- 実務では: パフォーマンス重視で「非正規化」も選択肢
7. Failure Modes(障害モード)
-
考え方: 「どう壊れるか」を前提に設計
-
例:
- ネットワーク断(タイムアウト)
- DBロック(Deadlock)
- ディスク容量不足
-
対策: リトライ処理、監視、冗長化
8. Profiling / Performance
-
目的: ボトルネック特定
-
手法:
- SQLの
EXPLAIN
/EXPLAIN ANALYZE
- Laravel
DB::listen()
や Telescope - APM(New Relic, Datadog)
- SQLの
-
見るポイント: インデックス利用、実行時間、キャッシュヒット率
9. Migration
-
概要: DBスキーマをコード化してバージョン管理
-
Laravel:
php artisan make:migration
-
メリット:
- チーム開発で環境差異をなくす
- ロールバック可能
- CI/CDと統合しやすい
10. まとめ
データベースは 正しい設計 + 正しい運用 が両輪。
ORMに頼りきらずSQLを理解する、ACIDとトランザクションを正しく使う、N+1や正規化・非正規化のトレードオフを理解する。
さらに Failure Modes や Profiling を意識すると、実務で差がつくポイントになります。
付録: チェックリスト
- ORMに頼らずSQLも理解しているか
- トランザクションでACIDを守れているか
- N+1問題を潰しているか(Eager Loading / JOIN)
- 正規化・非正規化のトレードオフを理解しているか
- 障害モード(ネットワーク断/ロック/容量不足)を想定しているか
- パフォーマンスプロファイリングを定期的にしているか
- Migrationでスキーマをコード管理しているか
Discussion