はじめに
達人に学ぶDB設計 徹底指南書を読みましたので、感想をまとめました。
学んだこと
- 物理設計を行う前に論理設計を行う(エンティティの抽出)
- サイジング(格納するデータに合わせたハードウェアの選定など)ではパフォーマンスと整合性のバランスで検討する必要がある
- 物理設計について サイジング→ストレージの冗長構成→ファイルの配置について決める
- RAIDについて
- RAID0は冗長性(RAID)がないため冗長性の向上においては候補として検討に挙げられない
- 第一正規化:スカラ値の原則(一つのセルには一つの値しか持たない)
- 第二正規化:部分関数従属を解消(主キーに対する一意の値は別テーブルに分離する)→可逆的な操作なので無損失分解となる
- 第三正規化:推移的関数従属を解消する(主キーだけでない二段階以上で存在する一意の値は別テーブルに分離する)
- 代理キーの使い方
- 人工的なキーをシステムで付与することで不都合を解消する
- ただ積極的に使うものではない、論理モデルがわかりにくくなるため
- ID列とシーケンスだとシーケンスの方が柔軟に使える
- アプリ側で採番テーブル機能を用意するのはあまり良くない(移行時のバグ誘発や機能的にバグを生み出す可能性が高い)
- アドホック(場当たり的)な集計キーは使わない、テーブルを分けたりビューを使うことで使用を避ける
- ビューからビューを参照するような設計は避ける、仕様がわかりにくくなったりパフォーマンスに悪影響なため
- データクレンジング(DBに登録するために綺麗な状態にする)
- 木構造の隣接リストモデルは指摘されている問題があり、最近では入れ子集合モデルが採用されている
良かったところ
演習問題を通してより深く学ぶことができる
- 単純に学んだことを復習するだけの演習問題でなく、本書の中で紹介されていなかった部分については調べるような問題などがあり、演習問題を通してより学ぶことができると感じた。
DBだけでなくハードウェアに関する部分についても掘り下げられていた
- RAIDやバックアップなど、ハードウェアに関する分野についても触れられており、単純なテーブルや設計の範囲だけでなく、パフォーマンスや冗長化などについても学べたと感じた。
難しかったところ
リレーショナルデータベースが木構造の取り扱いを苦手としていることに関連して、データモデルにも触れられていたが、データ構造の考え方についてはなかなかすぐにイメージしづらい部分だった。特に入れ子集合・入れ子区間モデルについてはなんとなく概念は理解できるが実際に頭の中で考えてみると意外と難しかった。理解しておくに越したことはないので何回か読み直して理解を深めていかなければと感じた。
最後に
単純に設計といってもやはり幅広いところまで考えていかないとできないと改めて感じた。データの持ち方だけでなくパフォーマンスや長期運用に伴う劣化など、考えることはとても多いがこれらを網羅することでより良い設計ができると思うとやはり学ぶべき分野だと改めて思ったため、今後もより深く学んでいきたいと思う。