📄
概念 📚 software-design-concepts

データモデリング

RDB・NoSQL・グラフDBのデータモデル設計と正規化・非正規化のトレードオフ

データモデリングとは、アプリケーションが扱うデータの構造・関係・制約をストレージ技術に合わせて設計する活動である。RDB(リレーショナルデータベース)ではテーブル・カラム・外部キーによってデータの整合性を宣言的に保証でき、正規化(Normalization)によってデータの重複を排除する。第一正規形(1NF)は繰り返しグループの排除、第二正規形(2NF)は部分関数従属の排除、第三正規形(3NF)は推移的関数従属の排除を要求し、3NF まで整備することで更新・削除・挿入の異常(anomaly)を防ぐことができる。

一方、読み取りパフォーマンスを優先する場合には非正規化が有効なケースがある。頻繁に JOIN が発生するクエリに対して事前結合したデータを一つのテーブルに持たせたり、集計値をカラムとして保持したりすることで、クエリの複雑さと実行コストを削減できる。ただし非正規化は書き込み時の更新整合性を維持するコストと引き換えであり、書き込み頻度と読み取り頻度のバランスを考慮して判断する必要がある。

NoSQL データベース(ドキュメント型・キーバリュー型・ワイドカラム型)はスキーマの柔軟性とスケールアウト特性を強みとするが、JOIN が苦手なため、アクセスパターン(クエリ先行設計)に基づいたデータ配置が必要になる。グラフDBは多対多関係が深く入れ子になる場合(ソーシャルグラフ・推薦システム・ナレッジグラフ)に強みを発揮する。スキーマ設計の選択はアプリケーションと強く結合するため、後からの変更コストは高く、初期設計の質が長期的なシステムの健全性に大きく影響する。

コードレビューで着目するポイント

  • 正規化の程度がユースケースと一致しているか(過度な正規化によるパフォーマンス問題が生じていないか)
  • 多対多関係が中間テーブル(junction table)で適切に表現されているか
  • 外部キー制約・NOT NULL 制約・UNIQUE 制約がデータ整合性を保証するために設定されているか
  • NoSQL でアクセスパターンに基づいたデータ配置設計(クエリ先行設計)がなされているか
  • スキーマの変更がアプリケーションコードとのバージョン管理と連動しているか(マイグレーション管理)
  • インデックス設計がクエリパターンと対応しているか(過不足なく)
  • 非正規化した際の更新一貫性を保つロジックがアプリケーション側に存在するか

典型的なアンチパターン

EAV(Entity-Attribute-Value)モデルの乱用: 汎用性を求めて属性をすべてキーバリュー形式で保存する設計。型安全性がなく、クエリが複雑になり、インデックスの恩恵を受けられなくなる。動的なスキーマが必要な場合は JSONB カラムやドキュメント型DBを検討する。

スキーマレス設計の過信: NoSQL の柔軟性に依存しすぎてスキーマを全く定義しないと、アプリケーション側で暗黙のスキーマが形成され、後からの整合性確認が困難になる。バリデーション層(JSON Schema 等)を設けるべき。

N+1 クエリを引き起こすスキーマ設計: 関連データを個別に取得する設計を前提としたスキーマになっており、アプリケーション側でループ内クエリ(N+1問題)が常態化している状態。

参考リソース

  • 『Database Design for Mere Mortals』Michael J. Hernandez(Addison-Wesley)
  • 『NoSQL Distilled』Martin Fowler & Pramod Sadalage(Addison-Wesley)
  • 『Designing Data-Intensive Applications』Martin Kleppmann(O’Reilly)
  • PostgreSQL ドキュメント(https://www.postgresql.org/docs/)
  • dbdiagram.io(ERD 設計ツール: https://dbdiagram.io/)