参考書を読んだメモ : 達人に学ぶDB設計 徹底指南書 2章

達人に学ぶDB設計 徹底指南書

論理設計と物理設計

概念スキーマと論理設計

  • 概念スキーマを定義する設計を論理設計
  • システムの世界では「論理」とは物理層の制約にとらわれないという意味で使われる
  • データベース設計は原則として論理設計が物理設計に先立つ
  • 1.エンティティの抽出
    • entity は日本語で実体
    • 実体と言っても物理的実体を伴っているわけではない
    • RDBではエンティティをテーブルという物理的単位で管理する
    • どのようなエンティティが必要かというのはどのようなデータを扱いたいかということ
    • 要件定義
  • 2.エンティティの定義
    • エンティティを抽出した後は各エンティティがどのようなデータを保持するかを決める必要がある
    • エンティティはデータを属性という形で保持する
      • これは二次元表における列と同義
  • 3.正規化
    • 正規化はエンティティについてシステムでの利用がスムーズに行えるように整理する作業
  • 4.ER図の作成
    • 正規化はエンティティを細かく分割していく作業なのでエンティティの数が増えている
    • このままではエンティティ同士の関係が把握しにくくなるため図を作成する

内部スキーマと物理設計

  • 1.テーブル設計
    • 論理設計で定義された概念スキーマをもとにそれをDBMS内部に格納するためのテーブルの単位に変換する作業
  • 2.インデックス定義
    • インデックス(索引)
    • インデックスが重要な役割を果たすのはパフォーマンス
  • 3.ハードウェアのサイジング
    • システムで利用するデータサイズを見積もりそれに十分な容量の記憶装置を選定する
    • システムが十分な性能を発揮できるだけのスペックのCPUやメモリを持ったサーバーを選定する
    • データベースの性能問題の8割はディスクI/Oによって起きる
    • データ整合性とパフォーマンスはトレードオフな関係
    • キャパシティのサイジング
      • データベース内に格納するデータ量は物理的なテーブル定義およびインデックス定義が終わらなければ算出できない
      • データ量にはデータベース内に格納するテーブル以外にもテキストや画像、HTMLといった様々な形式のファイル分も加算する必要がある
      • データ量はシステムの運用開始から増えていくため余裕を持たせたサイジングを行うか、あとで簡単に追加できるような構成にしておく必要がある
      • 拡張が簡単な構成をスケーラビリティが高いと表現する
    • パフォーマンスのサイジング
      • システム開発では性能要件を二つの指標を使って定義する
      • 処理時間: 特定の処理について何秒以内に終了すること
      • スループット: 単位時間あたりにどれだけの処理をこなせるか
    • 2つのサイジングを要件定義の段階で決めておく必要がある
  • 4.ストレージの冗長構成
    • 耐障害性を持つようにシステムを構築する技術がRAID
    • 複数のディスクを束ねて仮想的に一つのストレージとする技術
    • RAIDは本来システムの信頼性を高める技術だが、性能向上の利点もある
    • データを複数のディスクに分散して保持するため、ボトルネックであるディスクI/Oを分散することでパフォーマンス向上を図ることができる
    • RAID0
      • ストライピング
      • データを異なるディスクに分散してもつ
      • I/O性能はディスクが増えるほど向上するが1本でも故障したらデータが失われるため、冗長性は全くない
    • RAID1
      • ミラーリング
      • 2本のディスクに全く同じデータを持つ
      • 冗長性は二倍になり、ディスクが同時に壊れない限りデータは保全される
      • データは分散されていないため性能は変わらない
      • 2本で1つのデータを持つためディスクの使用効率も良くない
    • RAID5
      • パリティ分散と呼ばれる方式
      • ディスクが壊れてもパリティから実データを復元可能
      • 1本までならどのディスクが壊れてもデータを保全できる
      • データも分散できるため!/O性能の向上も期待できる
      • ディスク本数が増えるほど読み出し性能が向上する
      • パリティの計算を行うため書き込み性能は高くないがデータベースは書き込みより読み出しのデータ量が多いため読み出し性能が重視される
    • RAID10
      • RAID1 + 0 とも呼ぶ
      • RAID1のグループを2つ作りそのグループを作ってRAID0を作る
      • 欠点はコストが高い
      • RAID01というのもあるが信頼性はRAID10より若干劣る
    • RAID6
      • RAID5 の上位版
      • 二種類のパリティを持つことで2本故障した場合もデータを保持できる
      • RAID5よりコストが高い
  • 5.ファイルの物理配置
    • データベースに格納されるファイル
      • データファイル
      • インデックスファイル
      • システムファイル
      • 一時ファイル
      • ログファイル
    • 開発者が存在を意識するのはデータファイルとインデックスファイルだけ
    • 残りのファイルはDB管理者以外は意識しない
    • I/O量が多いのはデータファイル次にインデックスファイルと一時ファイル
    • 一番良いのはそれぞれ独立したディスクにおくことだが、コストが高い
    • I/Oコストの低いファイルは同グループにまとめると良い
    • 最近ではバイナリファイルをDBに格納することもある(サイズが大きくI/Oコストも高い

バックアップ設計

リカバリ設計

  • バックアップでは障害の直前にデータを戻すことはできない
  • バックアップファイルを戻す作業をリストア
  • トランザクションログを適用して変更文を反映することをリカバリと呼ぶ
    • これまでは区別せずリカバリと呼んでいたが以降は分けて使う
  • バックアップしていたトランザクションログを適用することもリカバリだが、DBMS内部にもトランザクションログは残っており、そこには最後のバックアップ後のユーザーからの変更ぶんが記録されている