まとめ　基本情報技術者　データベースについて

# 出題される単語について
## ビュー
* DBのスキーマ単位のもの（テーブル、ビュー、インデックス、プロシージャなど）
* 変数のようなもの
* 検索結果から、再度検索したい時などに、最初の検索結果をビューとして保存し、
	そのビューに検索を再度かける（変数のようなもの）

## トランザクション
### ジャーナルログ
* 「ログ」がある操作や出来事が「起こったという記録」を指すのに対し、ジャーナルはある操作や処理によって「変更された内容の記録」を指すことが多い。
* ジャーナルログに実行されたSQLが保存されており、トランザクション中にエラーが起きた場合、ジャーナルログのSQLを再度投げることで、データの不整合を防ぐ
### トランザクション分離レベル
分離レベル	ダーティリード	ファジーリード	ファントムリード
READ UNCOMMITTED	○	○	○
READ COMMITTED  ×	○	○
REPEATABLE READ	×	×	○
SERIALIZABLE	×	×	×
### ダーティリード (Dirty Read)
トランザクションBでコミットされていないデータをトランザクションAで読み取ってしまう問題が起きます。

### ファジーリード/ノンリピータブルリード (Fuzzy Read / Non-Repeatable Read)
トランザクションAでデータを複数回読み取っている途中で、トランザクションBでデータを更新してコミットした場合、トランザクションAで違う結果のデータを読み取ってしまう問題が起きます。(非再現リードとも呼ぶ)

### ファントムリード (Phantom Read)
トランザクションAで一定の範囲のレコードに対して処理を行っている途中で、トランザクションBでデータを追加・削除してコミットした場合、トランザクションAで幻影のようにデータが反映されるため、処理の結果が変わってしまう問題が起きます。

# 設計について
- ER図
    - エンティティとリレーションを図にしたもの
    - 多重度
        - 「1」は1
        - 「＊」は任意の整数
        - 「0…1」は範囲
        - 「1..＊」は1以上
- 正規化
    
    ### **候補キー**
    
    候補キーとはテーブル上で任意のレコードを特定するためのカラムの集合です。
    
    つまり主キーやユニークキーのことです。
    
    ### **非キー属性**
    
    候補キーに含まれないもの
    
    主キーやユニークキーに含まれないカラムのことを指します。
    
    ### **関数従属性**
    
    あるレコードにおいて、特定のカラムAの値が決まれば、別のカラムBも特定できるような関係のことを指します。
    
    ### **部分関数従属性**
    
    部分関数従属性とは、ある非キー属性が、候補キーのー部に関数従属している場合のことを指します。
    
    | **店舗名** | **購入者名** | **商品** | **価格** | **購入数** |
    | --- | --- | --- | --- | --- |
    | 新宿店 | 田中 | うまい棒 | 10 | 2台 |
    | 新宿店 | 田中 | ノート | 150 | 2台 |
    | 池袋店 | 田中 | 加湿器 | 2200 | 2台 |
    
    上記テーブルには価格カラムがありますが、これは「うまい棒はいくらか？」と聞かれれば「10円」とように、商品の価格は商品ごとに決まっています。
    
    上記の例では価格は商品に関数従属しています。
    
    **商品はこのテーブルの候補キー{店舗名,購入者名,商品}の一部です。**
    
    **つまり、価格は候補キーの一部である商品に部分関数従属しています。**
    
    ### **推移関数従属性**
    
    これは、あるテーブルの非キー属性Aが特定の非キー属性Bに関数従属しているような場合のことを指します。
    
    ※第3正規系の手順を適用するには、対象テーブルがすでに第2正規系となっている必要があります。
    
    X → A → B
    
    のような関係は、**Bは、Xが決まればAが決まりBが決まる、というようにBはXに対して間接的に従属していること**となります。
    
    このような関係を推移という表現がされています。
    
    ### 正規化の手順
    
    ### **第1正規系**
    
    第1正規系の条件は、テーブルで表現できる形になっていることです。
    
    つまり一つのカラムに1つの値のみ設定されている状態のことです。
    
    「属性の繰り返し」がないこと
    
    ### **第2正規系**
    
    第2正規系の条件は、テーブルのすべての候補キーにおいて部分関数従属性が存在しないことです。
    
    下記
    
    | **店舗名** | **購入者名** | **商品** | **価格** | **購入数** |
    | --- | --- | --- | --- | --- |
    | 新宿店 | 田中 | うまい棒 | 10 | 3 |
    | 新宿店 | 田中 | ノート | 150 | 2 |
    | 池袋店 | 田中 | 加湿器 | 2200 | 1 |
    
    は価格が商品に対して部分関数従属しているので、これを
    
    | **店舗名** | **購入者名** | **商品** | **購入数** |
    | --- | --- | --- | --- |
    | 新宿店 | 田中 | うまい棒 | 3 |
    | 新宿店 | 田中 | ノート | 1 |
    | 池袋店 | 田中 | 加湿器 | 2 |
    
    | **商品** | **価格** |
    | --- | --- |
    | うまい棒 | 10 |
    | ノート | 150 |
    | 加湿器 | 2200 |
    
    の２つのテーブルに分割して、部分関数従属性を排除します。
    
    第2正規系は要は、候補キーの一部→非キー属性の関数従属を排除します。
    
    ### **第3正規系**
    
    第3正規系の条件は、テーブル内の非キー属性→非キー属性の関数従属、つまり推移関数従属性が存在しないことです。
    
    例えばクラスの担任を管理する下記テーブルにおいて
    
    | **クラス** | **担任** | **経験年数** |
    | --- | --- | --- |
    | 2-A | 田中 | 3 |
    | 1-C | 鈴木 | 11 |
    
    このテーブルの候補キーは{クラス}ですが、担任の業務経験年数は担任の教師が決まればわかります。
    
    つまり非キー属性の経験年数は、非キー属性の担任に依存しています。
    
    これを
    
    | **クラス** | **担任** |
    | --- | --- |
    | 2-A | 田中 |
    | 1-C | 鈴木 |
    
    | **担任** | **経験年数** |
    | --- | --- |
    | 田中 | 3 |
    | 鈴木 | 11 |
    
    という形でテーブルを分割し、非キー属性間の関数従属（推移関数従属性）を排除します。
    
    第3正規系は要は、非キー属性→非キー属性の関数従属を排除します。
    
- DBMS（データベース管理システム）
    - アプリケーションの要求に応じてデータベースを操作すること
    - データ操作
        - 選択＝select
        - 射影＝select where
        - 結合＝join
        - 挿入＝insert
        - 更新＝update
        - 削除＝delete
    - ビュー
        - 実表から仮想的な表を生成する create view
        - データを隠蔽できる
        - 双方データを変更すると双方に適用
    - ストアドプロシージャ
        - 複数の命令を1つにまとめ、DBMSに保存したもの
        - クライアントとサーバーのアクセス数を軽減できる
        - 
- トランザクション
    - 関連する処理のまとまり
    - ACID特性
        
    - 障害回復
        - バックアップファイル
            
            データベース全体を保存しているファイル
            
        - ログファイル
            - トランザクションの前後を保存したファイル
                - 更新前ログファイル（トランザクション前）
                - 更新後ログファイル（トランザクション後）
        - ロールバック
            - トランザクション中の障害
            - トランザクション中の障害時に、「更新前ログファイル」を使って、「トランザクション開始前」に戻すこと
        - ロールフォワード
            - トランザクション後の障害
            - トランザクション後の障害時に、「バックアップファイル」と「更新後ログファイル」を使って、「トランザクション完了後」に戻すこと
            
- 排他制御
    - 複数の人が「同じデータ」を「更新」したときに、「データに矛盾が生じない」ようにすること
    - 専有ロック
        - 更新時に利用
        - 「ロックをかけたトランザクション」のみが「データを読み書きできる」
        - 他のトランザクション🙅
    - 共通ロック
        - 「ロックをかけたトランザクションと他のトランザクション」の両方が、「データの読み出しのみ」行える
        - 他の共通ロックのみトランザクション👌