🐡
(雑めも) 失敗から学ぶRDBの正しい歩き方を読んで
前提
- バックエンド開発・DB設計は経験があるが、自信が持てないことがあった。
- 正規化の概念は理解しているが、設計の妥当性に不安を感じることがある。
- アンチパターンを学ぶことで、問題を事前に予測し、適切な設計ができるようにしたい。
得られた知見
RDBを適切に設計・運用するには、以下の3つを正しく実行することが重要。
- データの表現(データの整合性を確保する)
- パフォーマンスの最適化(適切なインデックス・キャッシュ活用)
- 運用の適正化(ログ・バックアップ・設定管理)
1. データの表現
正しくデータを表現するとは、不整合が起きないようにデータを保存すること。
チェックポイント
- データの不整合が発生しないか検証する。
- 仕様変更・データ追加を想定し、柔軟性を確保する。
- 「変なデータ」を意図的に入れてみて、破綻しないか確認する。
2. パフォーマンスの最適化
パフォーマンスの最適化は、メンテナビリティ・理解しやすさとのトレードオフがあるため、慎重に設計する必要がある。
改善策
- インデックスの適切な活用
- 正規化を適切に行う(非正規化が必要な場合も考慮)
- マテリアライズドビュー(キャッシュ)の適用
- デッドロックを回避する設計
3. 運用の適正化
データベースの安定した運用のためには、以下の点を考慮する。
運用上の基本対策
- ログを適切に取得し、監視する
- 定期的なバックアップを確実に行う
- 設定の管理を適切に行う(接続数・メモリ割り当てなど)
4. 危険信号
以下のような問題が発生した場合は、設計を見直すべき。
(1) テーブル・カラム名が理解しづらい
- 適切な命名規則を定める。
- 正規化を適切に行う(無理に詰め込まない)。
- **CTE(共通テーブル式)**などを活用し、可読性を向上。
(2) データが壊れやすい
- 更新履歴を保存し、データを上書きしない。
- 非正規化しすぎない(拡張時に破綻しやすい)。
- 状態を持つカラム(フラグ等)に注意(設計次第でバグの温床になる)。
- 不要な外部キー参照を避ける(設計ミスによるバグを防ぐ)。
(3) データが理解しづらい
- キャッシュの乱用を避ける(多段マテビューの多用は危険)。
- 非正規化しすぎない(ポリモーフィックな設計は管理が困難)。
- JSON型を乱用しない(スキーマレス設計は適材適所)。
- 要件が曖昧な状態でテーブルを作成しない(後で拡張しにくくなる)。
(4) パフォーマンスが出ない
- ログを取得し、ボトルネックを特定できるようにする。
- ロックの仕組みを理解し、デッドロックを回避。
- フレームワークに依存しすぎない(生成されるSQLを理解する)。
- DBの設定を適切に管理する(デフォルトのまま放置しない)。
5. まだ理解が浅い点
- ロックの仕組み(実際にデッドロックが発生した経験がないため、手を動かして検証するのが良さそう)。
Discussion