データベースについて

## データベースとは

いろんなデータがある中で、独立したもの、繋がっているものさまざま
これらを一つにまとめて一括管理しているものが**データベース**




#### データベース管理システム（Date Base Management System）

基本・応用ソフトウェアは膨大なデータを蓄積しており、これらを管理している
アプリケーションには欠かすことのできない**ミドルウェア**である

#### 関係型データベース

表・行・列の形でデータを管理しており主流のデータベース
データが行単位で積み重なって表になる

* 表（テーブル）
　　　　データを入れる場所

* 行（レコード、組、タプル）
  １件分のデータのこと

* 列(データを構成する各項目)

**要は表計算ソフトみたいな見た目**


#### リレーショナルデータベース（RDB: Relational Datebase）

データの内容により複数の表と関連付けし扱うデータベースのこと
関係型データベースがまさにこれ






### 表を正規化する

新たな情報を更新する際に、古いものもそのまま残ったりということがないよう、表を分けて管理する
![スクリーンショット 2021-09-13 20.54.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/83ef9a12-d30e-6317-5715-70a739d27572.png)
![スクリーンショット 2021-09-13 20.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/925c85af-4869-c603-03f3-d4c9b710802c.png)

**正規化はミス防止のための予防処置になるし、業務の効率化にもつながる**


### 関係演算


蓄積されたデータはいくつかの方法によって効率よく活用することができる

　* 選択
　　　　行を取り出す演算で、特定のデータを取り出すことも可能
　
　* 射影
　　　　列を取り出す演算で、特定の列を取り出すことも可能　

　* 結合
　　　　共通の列を介すことで、表と表を合体させる演算


#### ビュー表

関係演算によって作った仮想的な表のこと

### スキーマ

データベースの構造や使用を定義する

**データベース規格であるANSI/X3/SPARCは３層スキーマ構造となっている**

![スキーマ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/81b06bb7-9d93-a816-813a-0e3e6024bc2b.png)

* 外部スキーマ
  ビュー表などユーザやプログラムに必要なデータを提供する
  プログラムが変更されても影響はここで対応する
  
* 概念スキーマ
  データベース本体のことで、独立性が保たれている

* 内部スキーマ
  データを物理的に記憶させることやハードウェアの変更についてここで対応してくれる

メリットは

* データの構造を変えなくてもビュー表はいじれる
* ハードウェアが変わってもプログラムの修正は必要ない

## 主キーと外部キー

### 主キー
表の中の行を識別するためのもの

例えば、社員番号や出席番号など**唯一無二となるもの**
名前などは同姓同名がいる可能性があるので主キーとはならない

主キーの条件は

* 表の中で内容が重複していない
* 内容が空ではない


### 外部キー
関連付けした別の表の主キーのこと

### 複合キー

１つの列では主キーにならないが、複数の列を組み合わせると主キーとなるもの

例えば...
![スクリーンショット 2021-11-03 23.31.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/a375e943-4811-9896-2434-282d911ed7d9.png)


このように学年の列だけでは複数人いて主キーにならないが、出席番号も組み合わせると
唯一無二の番号になる

## 正規化

**正規化を実行することで、データに矛盾や重複を生じさせない**

正規化には正規形という段階がある

* 非正規形

      正規化されていない表で繰り返し部分を持つ

![スクリーンショット 2021-11-03 23.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/48548750-af66-d6d8-d698-8e9e543b7a01.png)

このように色がついた部分が繰り返しとなっている


* 第１正規形

　　　　繰り返し部分を省き、１つの行として独立させた形


![スクリーンショット 2021-11-03 23.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/9b791954-5caa-fe7c-c9b8-529832317b31.png)

色のついた繰り返されていた部分を新たな行として存在させている

* 第２正規形
  
　　　部分関数従属している列を切り出した形

![スクリーンショット 2021-11-03 23.39.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/c8ffc4a5-2c32-4759-43fb-5469e6f9934e.png)
![スクリーンショット 2021-11-03 23.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/1f311c6e-485d-9bfa-ada1-96d6cfa5445a.png)

![スクリーンショット 2021-11-03 23.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/b5da50cb-acd1-5fda-4b5a-d9b586725f15.png)


このように**１つの表を３種類の表に正規化した**



#### 関数従属
主キーに対して特定の列が定まるもの

例えば、
社員番号があるならば、必ず**名前や部署が存在する**

![スクリーンショット 2021-11-03 23.44.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/95573d55-d523-e498-a018-77e510313725.png)

これが**関係従属**である

#### 部分関数従属

複合キーの一部の項目で特定の列が定まるもの

例えば、複合キーとして受注No.と商品コードがあるならば

![スクリーンショット 2021-11-03 23.45.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/cdb672b9-3e79-2881-d689-42ff0bb2ed4a.png)


このように

* 受注No.があれば、受注日付、顧客コード、顧客名称は必ず存在する
* 商品コードがあれば、商品名、単価は必ず存在する

これが**部分関係従属**である

* 第３正規形
  主キー以外の列に関係従属している列を切り出した形

![スクリーンショット 2021-11-03 23.56.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/7501a33d-d28b-878b-cf1e-8ca8c91e3433.png)

ここから
![スクリーンショット 2021-11-03 23.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/8a281f29-abca-2724-f334-379ade98dd6d.png)

新たに顧客表として分離される


この顧客コードがあるということは必ず顧客名称が存在する
**つまり顧客コードが主キーとなりうる**

**このように正規化は極限まで表を分解し管理する**

## SQL

### SQLとは

データベース管理システム（DBMS）に指示を与えるための
プログラミング言語のこと

SQLを使いデータを貯め込むだけではなく、
**あらゆる条件のもとデータを抽出し有効活用することができる**


#### SQLのまとめ記事
よろしければご覧ください

[SQLについて[まとめ]](https://qiita.com/koojiiiii/items/17ff796eb58f7590fa84)




## トランザクション管理と排他制御

### トランザクションとは
一連の処理を処理をひとまとめにしたもの

例えば、
1.お客さんから在庫の問い合わせがあった
2.在庫を確認する（在庫確認）
3.販売
4.在庫数を減らしデータを更新する（在庫更新）

この2と4の流れが一連の処理であり、**データベースはトランザクション単位で更新処理を管理する**

### 排他制御

例えば、先程のやりとりが同時に別のところで行われていたとしたら...
２人とも同じ在庫数を見ているので、そこから１つ減らして更新する
**つまり在庫は２つ減るはずなのに、１つしか減らない**

このようなミスが起きないように排他制御、つまりロックする方法がある

* 共有ロック
  他のユーザは読むことはできるが書き込むことはできない

* 専有ロック
  他のユーザは読み書きできない

#### デッドロック
複数のトランザクションが絡んだ作業の時には、それぞれがそれぞれのデータにロックをかけてしまい、
次の作業に使いたいデータにお互い入れない事象が起きる

**この場合はトランザクションを強制的に解除するしかない**

### ACID特性

データベース管理システムがトランザクションのために必要な特性を表している

* Atomicity(原子性)
  トランザクション処理は実行するかしないかしかない
  つまり中途半端な処理で終わることはできない

* Consistency(一貫性)
  処理結果に矛盾が起きてはいけない 

* Isolation（隔離性）
  複数のトランザクションを実行しても処理結果に矛盾が生じてはいけない

* Durability(耐久性)  
  トランザクションの更新結果は終了後にトラブルが起きても、消去されていない
  状態でなければいけない
  何かしら復旧手段が確保されていないとダメ


### ストアドプロシージャ

SQL文で書かれた処理手順をプロシージャというプログラムに入れておき、それをデータベース管理システムに
保存しておくこと

メリット

* クライアントがプロシージャを選ぶだけで、そく実行できるので
  処理が早い
* ネットワーク負荷の軽減につながる
  
## データベース障害管理

#### バックアップ

データベースが壊れ他時に備えて、常日頃から**バックアップ**をとっておく必要がある

#### ジャーナル

バックアップをとってからの情報を記録するログファイルのこと

ジャーナルには

* 更新後ジャーナル（更新後の状態）
* 更新前ジャーナル（更新前の状態）

が随時記録されて、**データベース更新履歴を管理している**

#### コミット
トランザクションの一連処理が全て終了し更新された時に、初めてデータベースに内容が反映されること

**トランザクションは中途半端に処理を終わらせることは許されない**ので、
処理が無事に終了し、最後の更新まで完了しなければデータベースの内容も反映できない

### ロールバック

トランザクションの処理中に障害が発生した場合、最後まで処理が完了しない場合がある
そんな時にジャーナルに記録されていた、更新前ジャーナルのデータを取得し、処理開始直前に戻る処理のこと



![ロールバック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/58e1a16e-c9e3-9f60-f7b3-076d351114ac.png)


## 分散データベースシステム

物理的に離れた場所にある複数のデータベースを**ひとつのデータベースとして扱う**こと

#### ２相コミット

トランザクションが行われた場合は、当然全データベースに内容が反映されなくてはいけない

なので、


1.主となるデータベースから、各地にコミット可能か確認する
2.OKと返答が来る
3.コミットもしくはロールバック（障害発生時）を指示

この方式を２相コミットという


### ロールフォワード

例えば、
突然ディスク障害が発生した場合、**日々残していたバックアップファイルから復元を行う**
更新後の情報は、ジャーナルの**更新後ジャーナルを取得**して、バックアップファイルに内容を反映させる

![ロールフォワード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/9ef15afd-a075-1902-4592-c8d4fbfd0a26.png)

これで復旧完了

この一連を**ロールフォワード**という



>参考書籍
>>きたみりゅうじ　『キタミ式　イラストIT塾　基本情報技術者　令和０３年』 技術評論社 2020年