🤖

データベースを学ぶ #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)
  • 見るポイント: インデックス利用、実行時間、キャッシュヒット率

9. Migration

  • 概要: DBスキーマをコード化してバージョン管理

  • Laravel: php artisan make:migration

  • メリット:

    • チーム開発で環境差異をなくす
    • ロールバック可能
    • CI/CDと統合しやすい

10. まとめ

データベースは 正しい設計 + 正しい運用 が両輪。
ORMに頼りきらずSQLを理解する、ACIDとトランザクションを正しく使う、N+1や正規化・非正規化のトレードオフを理解する。
さらに Failure ModesProfiling を意識すると、実務で差がつくポイントになります。

付録: チェックリスト

  • ORMに頼らずSQLも理解しているか
  • トランザクションでACIDを守れているか
  • N+1問題を潰しているか(Eager Loading / JOIN)
  • 正規化・非正規化のトレードオフを理解しているか
  • 障害モード(ネットワーク断/ロック/容量不足)を想定しているか
  • パフォーマンスプロファイリングを定期的にしているか
  • Migrationでスキーマをコード管理しているか

Discussion