参考書を読んだメモ : 達人に学ぶDB設計 徹底指南書 2章
達人に学ぶDB設計 徹底指南書
論理設計と物理設計
概念スキーマと論理設計
- 概念スキーマを定義する設計を論理設計
- システムの世界では「論理」とは物理層の制約にとらわれないという意味で使われる
- データベース設計は原則として論理設計が物理設計に先立つ
- 1.エンティティの抽出
- entity は日本語で実体
- 実体と言っても物理的実体を伴っているわけではない
- RDBではエンティティをテーブルという物理的単位で管理する
- どのようなエンティティが必要かというのはどのようなデータを扱いたいかということ
- 要件定義
- 2.エンティティの定義
- エンティティを抽出した後は各エンティティがどのようなデータを保持するかを決める必要がある
- エンティティはデータを属性という形で保持する
- これは二次元表における列と同義
- 3.正規化
- 正規化はエンティティについてシステムでの利用がスムーズに行えるように整理する作業
- 4.ER図の作成
- 正規化はエンティティを細かく分割していく作業なのでエンティティの数が増えている
- このままではエンティティ同士の関係が把握しにくくなるため図を作成する
内部スキーマと物理設計
- 1.テーブル設計
- 2.インデックス定義
- インデックス(索引)
- インデックスが重要な役割を果たすのはパフォーマンス
- 3.ハードウェアのサイジング
- システムで利用するデータサイズを見積もりそれに十分な容量の記憶装置を選定する
- システムが十分な性能を発揮できるだけのスペックのCPUやメモリを持ったサーバーを選定する
- データベースの性能問題の8割はディスクI/Oによって起きる
- データ整合性とパフォーマンスはトレードオフな関係
- キャパシティのサイジング
- データベース内に格納するデータ量は物理的なテーブル定義およびインデックス定義が終わらなければ算出できない
- データ量にはデータベース内に格納するテーブル以外にもテキストや画像、HTMLといった様々な形式のファイル分も加算する必要がある
- データ量はシステムの運用開始から増えていくため余裕を持たせたサイジングを行うか、あとで簡単に追加できるような構成にしておく必要がある
- 拡張が簡単な構成をスケーラビリティが高いと表現する
- パフォーマンスのサイジング
- 2つのサイジングを要件定義の段階で決めておく必要がある
- 4.ストレージの冗長構成
- 耐障害性を持つようにシステムを構築する技術がRAID
- 複数のディスクを束ねて仮想的に一つのストレージとする技術
- RAIDは本来システムの信頼性を高める技術だが、性能向上の利点もある
- データを複数のディスクに分散して保持するため、ボトルネックであるディスクI/Oを分散することでパフォーマンス向上を図ることができる
- RAID0
- ストライピング
- データを異なるディスクに分散してもつ
- I/O性能はディスクが増えるほど向上するが1本でも故障したらデータが失われるため、冗長性は全くない
- RAID1
- RAID5
- RAID10
- RAID1 + 0 とも呼ぶ
- RAID1のグループを2つ作りそのグループを作ってRAID0を作る
- 欠点はコストが高い
- RAID01というのもあるが信頼性はRAID10より若干劣る
- RAID6
- RAID5 の上位版
- 二種類のパリティを持つことで2本故障した場合もデータを保持できる
- RAID5よりコストが高い
- 5.ファイルの物理配置
- データベースに格納されるファイル
- データファイル
- インデックスファイル
- システムファイル
- 一時ファイル
- ログファイル
- 開発者が存在を意識するのはデータファイルとインデックスファイルだけ
- 残りのファイルはDB管理者以外は意識しない
- I/O量が多いのはデータファイル次にインデックスファイルと一時ファイル
- 一番良いのはそれぞれ独立したディスクにおくことだが、コストが高い
- I/Oコストの低いファイルは同グループにまとめると良い
- 最近ではバイナリファイルをDBに格納することもある(サイズが大きくI/Oコストも高い
- データベースに格納されるファイル
バックアップ設計
- フルバックアップ
- ある時点での全てのデータをバックアップにとる
- 全てのデータをバックアップに取るためバックアップの時間が長い
- ハードウェアリソースへの負荷が高い
- サービスの停止が必要
- 差分バックアップ
- 増分バックアップ