データベース　システムの構成と設計

## データベースシステムの構成

- クライアント/サーバー構成
    - クライアント(利用者)はサーバーに対して要求を送り、要求に応じた処理結果がサーバー側(DBMS)に送信される。
    - DBMSとプログラムを別マシン上で動作させるため、負荷を分散。
- 3階層構成
    - プレゼンテーション層・アプリケーション層・データ層で構成。
    - プログラムの集中管理が可能。
- 3層スキーマアーキテクチャ
    - 概念スキーマ・外部スキーマ・内部スキーマで構成。
    - データの物理的ば格納構造を変更しても、プロブラムに影響が及ばない。
- 分散データベース構成
    - データ層を増やすことで負荷を軽減。



## データベース設計

#### データベース設計の流れ
- データ分析
    - 階層型や関係型といったデータベースの種類を意識せず、E-Rモデルなどを用いて、データの意味を考えてモデル化を行う。
    - データ分析から得られたデータモデルを「概要データモデル」という。
- 論理設計
    - 利用するデータベースの種類を考慮し、関係型データモデルなどを用いて、データベース化する部分のモデル化を行う。
    - ディスク構成などを用いて、論理設計から得られたデータモデルを「論理データモデル」という。
- 物理設計
    - データベースを物理的にどのように格納するのか設計する。

#### データ分析
データ分析では、情報システム全体で必要となるデータの洗い出す。

- **ボトムアップアプローチ**
     - 現在業務システムで使用している、もしくは新業務システムで使用する画面や帳票などを基にデータ項目を洗い出し、データモデルを作成。
- **トップダウンアプローチ**
     - 利用者とのインタビューの内容を基に、システム要件からデータモデルを導き出し、データモデルを作成。


## 正規化
収集したデータ項目に対して、データを重複を排除し、関連性の強いエンティティにまとめる。

非正規形

| 売上番号 |   売上日  | 書籍番号 | 書籍名 | 分類番号 |    分類名    | 売上数 | 書籍番号 | 書籍名 | 分類番号 |    分類名    | 売上数 |
|:--------:|:---------:|:--------:|:------:|:--------:|:------------:|:------:|:--------:|:------:|:--------:|:------------:|:------:|
|    110   |  20/4/1 |    39    |    A   |     1    |   エッセイ   |    2   |    23    |    B   |     5    | コンピュータ |    2   |
|    120   | 20/4/13 |    26    |    C   |     5    | コンピュータ |    3   |    　    |   　   |    　    |      　      |   　   |
|    130   | 20/4/20 |    12    |    D   |     2    |     文学     |    1   |    42    |    E   |     4    |   ビジネス   |    1   |
 
- 書籍番号から売上数の項目が重複している。


#### 第1正規形
- 非正規形を第1正規形へ変換
- 主キーを設定し、繰り返し項目を別エンティティに分離する。

>売上番号を主キーに設定し、分離した以外のエンティティとまとめる。
>売上番号がわかれば、売上日も決定する関係を**関数従属**という。

>| 売上番号 | 売上日    |
|----------|-----------|
| 110      | 2020/4/1  |
| 120      | 2020/4/13 |
| 130      | 2020/4/20 |

>重複箇所を別エンティティに分離し、主キーを加える。

>| 売上番号 | 書籍番号 | 書籍名 | 分類番号 |    分類名    | 売上数 |
|:--------:|:--------:|:------:|:--------:|:------------:|:------:|
|    110   |    39    |    A   |     1    |   エッセイ   |    2   |
|    110   |    23    |    B   |     5    | コンピュータ |    2   |
|    120   |    26    |    C   |     5    | コンピュータ |    3   |
|    130   |    42    |    D   |     4    |   ビジネス   |    1   |
|    130   |    12    |    E   |     2    |     文学     |    1   |


#### 第2正規形
- 第1正規形を第2正規形へ変換
- 第1正規形のエンティティから「部分関数従属」している項目を分離する。
- 主キーを分離したエンティティに追加する。

>書籍番号を主キーとする。

>| 書籍番号 | 書籍名 | 分類番号 |    分類名    |
|:--------:|:------:|:--------:|:------------:|
|    39    |    A   |     1    |   エッセイ   |
|    23    |    B   |     5    | コンピュータ |
|    26    |    C   |     5    | コンピュータ |
|    42    |    D   |     4    |   ビジネス   |
|    12    |    E   |     2    |     文学     |

>主キーを分離したエンティティに追加する。
>売上番号と書籍番号は売上数と**完全関数従属**している。

>| 売上番号 | 書籍番号 | 売上数 |
|----------|----------|--------|
| 110      | 39       | 2      |
| 110      | 23       | 2      |
| 120      | 26       | 3      |
| 130      | 42       | 1      |
| 130      | 12       | 1      |


#### 第3正規形
- 第2正規形を第3正規形へ変換
- 第2正規形のエンティティから主キー以外のデータ項目に関数従属している項目を別エンティティとして分離する。

>主キー以外に関数従属している部分を分離する。

>| 分類番号 |  分類名  |
|:--------:|:--------:|
|     1    | エッセイ |
|     2    |   文学   |
|     4    | ビジネス |

>もとのエンティティには分離したエンティティとの関係を維持するため、分離されたエンティティの主キーを残す。

>| 書籍番号 | 書籍名 | 分類番号 |
|:--------:|:------:|:--------:|
|    39    |    A   |     1    |
|    23    |    B   |     5    |
|    26    |    C   |     5    |
|    42    |    D   |     4    |
|    12    |    E   |     2    |


###### エンティティ統合
- 主キーが同一のエンティティ同士を集める。
- エンティティ同士の関係性を意識し、状況に合わせて結合する。