データベース

現在勉強している基本情報技術者試験についてまとめたものです。
自分のアウトプット用なので見やすさなどは期待しないでください。

# DBMSと関係データベース

DBMSとは**データベース管理システム**のことで、データベースの定義や操作、制御などの機能を持つミドルウェア。
データベースの代表的なものは、**関係型**、階層型、ネットワーク型の3つがあり、関係型が現在の主流。
関係データベースは、**リレーショナルデータベース（RDB）**とも呼ばれる。

**関係演算**
表の中から特定の行や列を取り出したり、表と表をくっつけて新しい表を作り出したりする演算のことで、以下のようなものがある。

・**選択**
行を取り出す演算で、表の中から特的の条件に合致する行だけを取り出すことができる。

・**射影**
列を取り出す演算で、表の中から特定の条件に合致する列だけを取り出すことができる。

・**結合**
表と表をくっつける演算で、表の中にある共通の列を介して2つの表をつなぎ合わせる。

関係演算を用いると、溜め込んだデータを使って様々な表を生み出すことができる。
このような、仮想敵に作る一時的な表のことを**ビュー表**という。

**スキーマ**
データベースの構造や仕様を定義するもので、標準的に使用されている規格では**３層スキーマ構造**を取っている。
これは、**外部スキーマ（利用者の必要とするデータの見方）、概念スキーマ（データの論理的関係）、内部スキーマ（データの物理的関係）**という３層に定義を分けることで、データの独立性を高めている。

# 主キーと外部キー

**主キー**
データベースの表で、その中の行一つ一つを識別するためのキーとなる情報。
一つの列では一意にならないが、複数の列を組み合わせて主キーとしたものを**複合キー**と呼ぶ。

**外部キー**
表と表とを関係付けるため、他の表の主キーを参照する列のこと。

# 正規化

**正規化**
関係データベースにおいて、蓄積されているデータに矛盾や重複が発生しないように、表を最適化すること。
以下の順番で正規化を行いわかりやすくする。

・非正規形
繰り返し部分があるため、各レコードの長さがバラバラで、２次元の表になっていない状態。

・第１正規形
非正規形の表から、繰り返し部分を取り除いたもの。

主キーが決まれば、列の値が一意に定まる関係を**関数従属**と呼び、複合キーの一部の項目だけで、列の値が一意に定まる関係を**部分関数従属**と呼ぶ。

・第２正規形
第１正規形の表から、部分関数従属している列を切り出したもの。

・第３正規形
第２正規形の表から、主キー以外の列に関数従属している列を切り出したもの。

# SQL

**SQL(Structured Query Language)**
DBMSへと指示を伝えるために用いる言語で、スキーマの定義や表の作成といった定義を担当する**データ定義言語(DDL:Data Definition Language)**と、データの抽出や挿入、更新、削除といった操作を担当する**データ操作言語(DML:Data Manipulation Language)**とに大別することができる。

**SELECT文**
SELECT文を用いることでデータを抽出することができる。

特定の列を抽出（射影）場合は以下のように指定する。
列名に**アスタリスク**を指定するとすべての列が対象となる。

**SELECT　列名　FROM　表名**

特定の行を抽出する（選択）場合は、**WHERE句**を使って以下のように指定する。

**SELECT　＊　FROM　表名　WHERE　条件**

表と表を結合する（結合）場合は、FROM句の中に結合したい表を羅列して、WHERE句でどの列を使うかを指定する。

**SELECT　＊　FROM　表名１、表名２　WHERE　表名１.列名＝表名２.列名**

抽出結果を整列させておきたい場合は下記のように**ORDER　BY句**を指定する。

**ORDER　BY　列名　ASC（DESC）**

SQLには、データを取り出す際に集計を行う、様々な関数（**集合関数**）がある。

| 関数 | 機能 |
|:-:|:--|
| MAX | 最大値を求める。 |
| MIN | 最小値を求める。 |
| AVG | 平均値を求める。 |
| SUM | 合計を求める。 |
| COUNT(*) | 行数を求める。 |
| COUNT(列名) | その列の値が入っている行数を求める。 |

特定の列を指して、その中身が一致する項目をひとまとめにして扱うことをグループ化と呼び、下記のように**GROUP　BY句**を指定する。
この時、**HAVING句**を用いて条件をつけて取り出すグループを絞り込むことができる。

**GROUP　BY　列名　HAVING　絞り込み条件**

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

データベースでは、一連の処理をひとまとめにしたものを**トランザクション**と呼び、トランザクション単位で更新処理を管理する。

排他制御は処理中のデータをロックして、他の人が読み書きできないようにする機能で、トランザクションの間、使用するデータをロックすることで、誰かに割り込まれてデータの不整合が生じるのを防ぐ。

ロックする方法は、他のユーザーがデータを読むことはできるが書くことはできない**共有ロック**とデータを読むことも書くこともできない**専用ロック**の２種類がある。

**デッドロック**
複数のトランザクションがお互いに相手の使いたいデータをロックしてしまうこと。

**ACID特性**
データベース管理システムでの、トランザクション処理に対して必須とされる次の4つの特性の頭文字をとったもの。

・**Atomicity(原子性)**
トランザクションの処理結果は、全て実行されるか全く実行されないかのいずれかで終了し、中途半端に一部だけ実行されるようなことは許容しない。

・**Consistency(一貫性)**
データベースの内容が矛盾のない状態であること。

・**Isolation(隔離性)**
複数のトランザクションを同時に実行した場合と、順番に実行した場合の処理結果が一致すること。

・**Durability(耐久性)**
正常に終了したトランザクションの更新結果は、障害が発生してもデータベースから消失しないこと。

**ストアドプロシージャ**
SQL文を一つのプログラムにまとめ、データベース管理システム側にあらかじめ保存しておくこと。

# データベースの障害管理

データベースは障害の発生に備えて定期的に**バックアップ**を取ることが基本で、頻度を決めてその時点のデータベース内容を丸ごと別のファイルにコピーして保管する。

バックアップを取ってから、次のバックアップを取るまでの間の更新は、**ジャーナル**と呼ばれるログファイルに、更新前の状態（**更新前ジャーナル**）と更新後の状態（**更新後ジャーナル**）を逐一記録して、データベースの更新履歴を管理している。

**コミット**
トランザクションは、一連の処理が問題なく完了できた時、最後にその更新を確定することで、データベースへと更新内容を反映させること。

**ロールバック**
トランザクション処理中に何らかの障害が発生して更新に失敗した場合、データ更新前の状態を更新前ジャーナルから取得して、データベースをトランザクション開始直前の状態にまで戻すこと。

**分散データベースシステム**
物理的に分かれている複数のデータベースを、見かけ上一つのデータベースとして扱えるようにしたシステム。

**２相コミット**
分散データベースでは、トランザクション処理が各サイトに渡って行われるため、全体の同期を取ってコミットやロールバックを行うようにしないと、データの整合性が取れなくなってしまう。
そのため、まず全サイトに対してコミットできるか問い合わせを行い、その結果を見てコミットもしくはロールバックを行う方式。

**ロールフォワード**
ディスク障害などで突然データベースが故障してしまった場合は、バックアップファイルからデータを復元する必要が出てくる。
その際、データベースに行った更新情報を、バックアップ以降の更新後ジャーナルから取得して、データベースを障害発生直後の状態にまで復旧させる一連の処理。