🐡

(雑めも) 失敗から学ぶRDBの正しい歩き方を読んで

に公開

前提

  • バックエンド開発・DB設計は経験があるが、自信が持てないことがあった。
  • 正規化の概念は理解しているが、設計の妥当性に不安を感じることがある。
  • アンチパターンを学ぶことで、問題を事前に予測し、適切な設計ができるようにしたい。

得られた知見

RDBを適切に設計・運用するには、以下の3つを正しく実行することが重要。

  • データの表現(データの整合性を確保する)
  • パフォーマンスの最適化(適切なインデックス・キャッシュ活用)
  • 運用の適正化(ログ・バックアップ・設定管理)

1. データの表現

正しくデータを表現するとは、不整合が起きないようにデータを保存すること。
チェックポイント

  • データの不整合が発生しないか検証する。
  • 仕様変更・データ追加を想定し、柔軟性を確保する。
  • 「変なデータ」を意図的に入れてみて、破綻しないか確認する。

2. パフォーマンスの最適化

パフォーマンスの最適化は、メンテナビリティ・理解しやすさとのトレードオフがあるため、慎重に設計する必要がある。
改善策

  • インデックスの適切な活用
  • 正規化を適切に行う(非正規化が必要な場合も考慮)
  • マテリアライズドビュー(キャッシュ)の適用
  • デッドロックを回避する設計

3. 運用の適正化

データベースの安定した運用のためには、以下の点を考慮する。
運用上の基本対策

  • ログを適切に取得し、監視する
  • 定期的なバックアップを確実に行う
  • 設定の管理を適切に行う(接続数・メモリ割り当てなど)

4. 危険信号

以下のような問題が発生した場合は、設計を見直すべき。
(1) テーブル・カラム名が理解しづらい

  • 適切な命名規則を定める。
  • 正規化を適切に行う(無理に詰め込まない)。
  • **CTE(共通テーブル式)**などを活用し、可読性を向上。

(2) データが壊れやすい

  • 更新履歴を保存し、データを上書きしない。
  • 非正規化しすぎない(拡張時に破綻しやすい)。
  • 状態を持つカラム(フラグ等)に注意(設計次第でバグの温床になる)。
  • 不要な外部キー参照を避ける(設計ミスによるバグを防ぐ)。

(3) データが理解しづらい

  • キャッシュの乱用を避ける(多段マテビューの多用は危険)。
  • 非正規化しすぎない(ポリモーフィックな設計は管理が困難)。
  • JSON型を乱用しない(スキーマレス設計は適材適所)。
  • 要件が曖昧な状態でテーブルを作成しない(後で拡張しにくくなる)。

(4) パフォーマンスが出ない

  • ログを取得し、ボトルネックを特定できるようにする。
  • ロックの仕組みを理解し、デッドロックを回避。
  • フレームワークに依存しすぎない(生成されるSQLを理解する)。
  • DBの設定を適切に管理する(デフォルトのまま放置しない)。

5. まだ理解が浅い点

  • ロックの仕組み(実際にデッドロックが発生した経験がないため、手を動かして検証するのが良さそう)。
GitHubで編集を提案

Discussion