初心者が書籍「データベースのきほん」を読んで内容を構造化してみた（前半）

# 書籍「データベースのきほん」

## 基本概念
- データベースの基本機能
  - 検索と更新
    - 検索
    - 更新
      - 登録
      - 修正
      - 削除
  - 同時実行制御
  - 耐障害性
  - セキュリティ
- データベースの分類
  - 階層型データベース
  - リレーショナルデータベース（RDB）
  - オブジェクト指向データベース
  - XMLデータベース
  - NoSQLデータベース
- データベースアーキテクチャパターン
  - スタンドアロン
  - クラスタリング
    - シェアードナッシング
    - シェアードディスク
      - Active-Active
      - Active-StandBy
        - Hot-StandBy
        - Cold-StandBy
  - レプリケーション
    - マスタスレーブ
    - マルチマスタ
- データベースの4層構造
  - インスタンス
    - データベース
      - スキーマ
        - テーブル
  - 備考
    - MySQL,Oraclは3層構造でデータベースとスキーマを一体でとられる
- テーブル設計
  - 正規化（よく使う第三正規化まで書いてみる）
    - 第一正規化 : スカラ化
    - 第二正規化 : 部分関数従属の解消
    - 第三正規化 : 推移関数従属の解消

## RDBM 
- RDBM（MySQLを例に）
  - 命令の分類
    - DDL : Database Definition Language
      - スキーマやテーブルへの命令
        - ex. CREATE, DROP, ALTER
    - DML : Database Manipulation Language
      - テーブル内の検索や編集
        - ex. SELECT, INSERT, UPDATE, DELETE
    - DCL : Database Control Language
      - 操作の確定、取り消し
        - ex. COMMIT, ROLLBACK
  - 関数
    - 集約関数(countなど)が使える場所
      - SELECT
      - ORDER_BY
      - HAVING
    - 記載順序の原則
      - SELECT
      - FROM
      - WHERE
      - GROUP_BY
      - HAVING
      - ORDER＿BY
  - view
    - viewの利点
      - SELECTの記述を減らせる
      - 必要な部分だけ表示/更新の制限ができる
      - 削除してもテーブルに影響がない
    - viewの登録/更新の制約
      - どの行が対応しているかわからない場合(ex.ditinct)
      - なんの値を入れたら良いかわからない場合
  - サブクエリ
  - 結合
    - 結合の種類
      - 内部結合：共通部分だけをとってくる
      - 左外部結合：左にあるものを全部とってくる
      - 右外部結合：右にあるものを全部とってくる
      - 完全外部結合：どちらかにあれば全部とってくる
      - 交差結合 : 双方の全組合せをとってくる
  - トランザクション : クエリ処理のまとまり
    - 2タイプのテーブル(MySQLで扱う)
      - MyISAM型 : トランザクションが使えない
      - InnoDB型 : トランザクションが使える
    - ACID特性
      - Atomicity : 全部成功or全部失敗の担保
        - BEGIN, ROLLBACK, COMMIT
      - Consistency : 整合性制約を守っている
      - Isolation : それぞれの処理が(分離レベルに照らしわせて)矛盾なく行える
        - ANSI(American National Standard Institutie)の分離レベル（順序;厳しい→ゆるい）
          - ①Serializable : トランザクションが順次実行された場合と同じ結果
          - ②Repeatable Read : Phantomがおこる
          - ③Read Committed : あるトランザクションが以前読み込んだデータを再度読み込んだときに前回と結果が異なる
          - ④Read UnCommitted : コミット前に別のトランザクションが読み取り可能になってしまう
        - 分離レベルの緩和で生じる3現象
          - Dirty Read : ④
          - Fuzzy Read : ③, ④
          - Phantom    : ②, ③, ④
      - Durability : （持続性と合わせてパフォーマンスを考慮していく）
        - 課題
          - HDDへの同期書き込みはランダムな記憶領域の構造上パフォーマンスに耐えない
        - 持続性とパフォーマンスのバランスをとる仕組み
          - WAL(Write Ahead Log) : ログレコード(MySQLではInnoDBログ)を書き込み、その後同期する
            - ディスクに対して連続の書き込み→パフォーマンスいい
            - 記憶装置への書き込み回数/容量を減らせる
            - データベースバッファを使用してファイルへの変更を効率的に扱える
          - データベースバッファ
            - シーケンス
              - 更新前
                - メモリ上のバッファプールにページ（バッファの単位）が読み込まれる
              - 更新中
                - 更新がバッファプールの当該ページに行われる
                - コミットとともにディスク上のログファイルに更新内容が記録される
              - チェックポイント実行
                - 更新されたページ（Dirty Page）はチェックポイントでまとめてデータファイルに書き込まれる
                - チェックポイント以前のログファイルが破棄される
          - クラッシュリカバリ
            - WALとデータベースファイルから修復
            - ただし、論理破壊/物理破壊には対応できない
    - PITR(Point in Time Recovery)
        - 仕組み
          - バックアップ
            - 分類
              - データベースの状態
                - ホットバックアップ
                - コールドバックアップ(オフラインバックアップ)
              - データの形式
                - 論理バックアップ
                - 物理バックアップ
              - 対象とデータ量
                - フルバクアップ
                - 部分バックアップ
                  - 差分バックアップ
                  - 増分バックアップ
          - リストア
          - アーカイブ
          - リカバリ
    - MVCC(Multi Versioning Concurrency Control)
      - 特性
        - 更新⇔読込,読込⇔読込は互いにブロックしない
        - 読込の内容は分離レベルによって変化する可能性がある
        - 更新の際は、基本的に行単位でロックを取得する
        - 更新⇔更新では後のトランザクションのロックをブロックする。一定時間を超えるとロックタイムアウトとなる
        - ロールバックセグメントにUNDOログを保持する
          - トランザクションのROLLBACK時に更新前に戻すため
          - 複数のトランザクションからの参照を分離レベルに応じて実行するため
      - 課題
        - ロックタイムアウト
          - 更新⇔更新では後のトランザクションはロック待ちの状態になる。一定時間を超えるとエラーを返す
          - MySQLの場合
            - 最低1sec以上でwaitをかけられる(MySQL)
            - デフォルトではロックタイムアウトが出た場合エラーを出したクエリのみロールバックする(MySQL)
            - 全体のロールバックの手法
              - タイムアウトエラー後に明示的にROLLBACKｗ発行
              - InnoDB_rollback_on_timeoutのシステム変数を設定する
        - デッドロック
          - トランザクション同士が互いにロックを対象的に持つと解消されなくなる
          - 対策
            - DBMS
              - トランザクションのコミット頻度を上げる(TXを小さくする)
              - 決まった順序のテーブル/行アクセスにする
              - ロック読み取りを不用意に使わない
              - ロック範囲を狭くする
            - MySQL(InnoDB)
              - indexを利用して最小限のロック範囲とする