データベース用語集

この度、研修も終わりイルカさんチームに配属されたので、勉強がてらデータベースの用語を簡単にまとめてみようと思います。
（RDBMSメインになります)

# データベース
検索・追加・更新などがしやすいように整理された情報の集合。データベース管理システム(DBMS)やDBMS上で管理されるデータ群のことを指していわれることもある。

# DBMS(Database Management System)
コンピュータ上でデータベースを構築・運用するためのシステム、およびソフトウェア。

# データモデル
どのようにデータベースが構造化され利用されるかを定めた仕様。

## 階層型
データを木構造で表現したデータモデル。データは常に1対多の親子関係となるため冗長化が起こりやすい。

## ネットワーク型
任意のデータ同士を繋げることができる網目状のデータモデル。多対多の関係性を表現できるが、データの検索や更新がデータ構造に強く依存し、かなりの習熟者でないとコーディングが煩雑になりやすい。

## リレーショナル型
関係型モデルとも呼ばれ、データを行と列からなる2次元の表形式で表したデータモデル。行はデータのエントリー(レコード)を表し、列はエントリーが持つ属性(各項目)を示す。データ同士は複数の表(テーブル)の同士の関係によって関連付けられて、SQLによってユーザからの目的に応じた操作が可能となる。

***

# RDBMS(Relational Database Management System)
リレーショナル型のデータモデルに基づいて設計、開発されたデータモデル管理システム。
代表的なものとして、OSSでは**MySQL**, PostgreSQL, MariaDB、商用ではOracle Database, IBM  DB2などがある。

## レコード
DBに記録する一件一件のデータの基本単位。通常複数の項目に対応する値を持つ。

## フィールド
各レコードに含まれるデータ項目。

## テーブル
列がフィールド、行がレコードからなる表。RDBにおけるテーブルはデータを格納する場所の基本単位で、原則としてすべてのデータは何らかのテーブルに保管される。

## 主キー(Primary Key)
テーブル内で各レコードを一意に識別するためのフィールド。

## インデックス
データの検索効率を向上させるための仕組み。インデックス構造はB-Treeがよく用いられる。

## ビュー
テーブルから必要なデータを取得し組み合わせて表された仮想的なテーブル。

## スキーマ
データ構造や関連性、操作方法といったデータベースの設計図。

## 3層スキーマ
データベースのスキーマを3階層に分けて定義する方式。

### 内部スキーマ
概念スキーマで定義された論理データの物理的な格納方法を定義する。

### 概念スキーマ
データベース化する対象のデータ要素やデータ同士の関係性などのデータ構造を定義する。(テーブルに相当)

### 外部スキーマ
概念スキーマで定義された論理データから必要な部分を取り出したもの。(ビューに相当)

## 正規化
表構造を整理するために、データの冗長性がない状態(One Fact In One Place)となるよう整合性の取れたデータ構造を導き出す手法。

### 関数従属
ある2つのデータ項目間において、一方の値がもう一方の値を関数的に決定する性質。

#### 部分関数従属
複数の候補キーの一部に関数従属している状態。(逆に全てに関数従属している状態を完全関数従属と呼ぶ)

#### 推移的関数従属
関数従属性が推移的に導かれる状態、すなわち3つのデータA,B,Cに関してA→BかつB→Cかつ(A→Cではない)ときCはAに推移的関数従属していると言える。

### 非正規形
全く正規化が行われていない、繰り返し項目・集合属性を含んでいるテーブルの状態。

### 第1正規形
非正規形のテーブルから、繰り返し部分を排除した結果のテーブルの状態。

### 第2正規形
第1正規形のテーブルから、部分関数従属している項目を排除した結果のテーブルの状態。

### 第3正規形
第2正規形のテーブルから、主キーに推移的関数従属している項目を排除した結果同のテーブルの状態。

## SQL(Structured Query Language)
RDBMSにおいて、データの操作や定義を行うためのデータベース言語、またドメイン固有言語。

### DDL(Data Definition Language)
SQLにおいて、データを定義するための命令群。データベースとテーブルの作成(CREATE)・更新(ALTER)・削除(DROP)を行う。

### DML(Data Manipulation Language)
SQLにおいて、データを操作するための命令群。テーブルのレコードの取得(SELECT)・追加(INSERT)・更新(UPDATE)・削除(DELETE)を行う。

### DCL(Data Control Language)
SQLにおいて、トランザクションを制御するための命令群。トランザクション処理の開始(BEGIN)・確定(COMMIT)・取り消し(ROLLBACK)を行う。

## トランザクション
関連する複数のクエリを処理単位としてまとめたもの。トランザクション処理はACID特性と呼ばれる4つの性質を求められる。

### Atomicity(原子性/不可分性)
トランザクションに含まれる各処理は「すべて実行される」or「1つも実行されない」どちらかの結果になるという性質。例えばサーバーやネットワーク障害により、途中までしか実行されていなかった場合はトランザクションを開始する前の状態に戻される。

### Consistency(一貫性/整合性)
トランザクションの前後でデータの整合性が保たれ、矛盾のない状態が継続される性質。トランザクションに関係するすべての条件が満足されることを保証する。例えば在庫を超える数の注文がされて在庫数がマイナスになってしまったり、UNIQUE制約のカラムにもかかわらず値が重複してしまうといったことが生じることを防ぐ。

### Isolation(独立性/隔離性)
複数の実行中トランザクションの処理過程が、お互いの処理に影響を与えない性質。別のトランザクションの影響をどの程度隠蔽するかはトランザクション分離レベルによって異なる。

### Durability(耐久性/永続性)
トランザクションが完了したとき、その結果は記録され、システム障害などが発生しても失われることがないという性質。データの更新履歴をログに保存しておくことにより、ストレージへの書き込みが中断された場合でもログを元に実行結果を再現することができる。

### ロールバック
トランザクション中で、それより前のチェックポイント時点での状態に戻すこと。

### ロールフォワード
障害などによりトランザクションが中断された際、記録されているチェックポイントの状態を再現した上でログファイルに残っているチェックポイント後の処理まで実行し障害直前の状態まで戻すこと。

### ロック
データの取得・更新を制御すること。あるクエリが特定データを更新するとき、実行前にロックして他のクエリがそのデータを読み書きできないようにすることを排他制御という。

### デッドロック
2つのトランザクションがそれじれロックしているデータのロック解除を互いに待っている状態。解除されないと次の処理に進まないため、何らかの回避策を施しておく必要がある。

### トランザクション分離レベル
トランザクション間の分離度合いのこと。他のトランザクションから受ける影響によって幾つかの問題が発生する。

#### ダーティリード(Dirty Read)
他のトランザクションでコミットされていない結果を読み取ってしまう現象。

#### ファジーリード/ノンリピータブルリード(Fuzzy Read / Non-Repeatable Read)
あるデータを複数回読み取っている途中で、他のトランザクションがそのデータを更新したとき、その更新後の値を読み取ってしまう現象。

#### ファントムリード(Phantom Read)
ある一定の範囲のレコードに対して処理を行っている途中で、他のトランザクションがその範囲にレコードを追加・削除を行ったとき、その追加・削除が反映されてしまう現象。

#### READ-UNCOMMITTED
他のトランザクションのコミットされていない変更を参照できる。

#### READ-COMMITTED
他のトランザクションのコミットされた変更を参照できる。

#### REPEATABLE-READ
既存のレコードに関しては、トランザクション開始時の値を読み取るが、他のトランザクションによるコミットされた追加・削除を参照できる。
※ MySQLのデフォルト。InnoDBではギャップロックやネクストキーロックという仕組みによりファントムリードが発生しない。

#### SERIALIZABLE
複数の並列して動くトランザクションそれぞれの結果が、逐次実行した場合と同じ結果になる。最も強い分離レベルであり、最も安全にデータを操作できるが、相対的に性能は低い。

## レプリケーション
あるデータベースの複製を、別のコンピュータ上に展開しデータの内容を同期させる機能。