データベース設計とデータベース基礎理論の学習メモ

#１、キー（key）について
##キーの種類
###１、主キー（primary key）
関係（表）の中に１つだけ設定するキーの事。候補キー（後述）の中から最もふさわしいものが選ばれる。
（制約）１、**一意性制約**
　　　　２、**非NULL制約**
###２、候補キー
関係（表）の中に複数存在することもあるキーが候補キーである。”主キーの候補となるキー”の事。
（候補キーの条件）１、タプルを一意に識別できる事
　　　　　　　　　２、**極小である事**
　　　　　　　　　３、**主キーとは異なりNULL値を許容する事**
###３、スーパーキー
関係（表）の中に、候補キーの数以上に存在するもの。
スーパーキーは、タプルを１つに特定できるという条件さえ満たせばいい（極小出なくても良い）具体的には、候補キーのに様々な組み合わせで他の属性を付け足したものの事。その為、**関係（表）の全ての属性もスーパーキーの１つである**。
###４、サロゲートキー(surrogate key)
ナチュラルキーとは異なり、属性の性質から主キーになれると言うことではなく、（連番）などのようにその属性自体に意味はなく、一意性を確保して主キーとして使う為だけに付与される。

###５、ナチュラルキー(natural key)
エンティティが本来もつ属性からなる**主キー**（都道府県名）などを"ナチュラルキー"もしくは"自然キー"と言う

##主キー、候補キー、スーパーキーの違い
|社員番号|連番|名前|性別|電話番号|住所|
|:-----------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
|0001|01|Alex|Male|080-XXX-XXX|栃木県...|
|0001|02|Bill|Male|090-XXX-XXX|東京都...|
|0002|01|Mike|Female|070-XXX-XXX|NULL|
|0003|01|Steve|Male|080-XXX-XXX|島根県...|
|0003|02|Lucas|Male|NULL|福島県...|

この表の場合、
（１）*社員番号*と*連番*
（２）*社員番号*と*電話番号*と*住所*
の組み合わせで一意にタプルと特定する事ができる。つまり、候補キーは以下のようになる。
候補キーは
１、{社員番号、連番}
２、{社員番号、電話番号、住所}
となる。ここでポイントとなるのが、候補キーなので*住所*や*電話番号*のNULLは値を許容され候補キーとなることができる。それと対峙して*社員番号*と*連番*においてはNULL値を許容していない。その為、この場合は主キーは*{社員番号、連番}*となる。
スーパーキーは、上記の２つの候補キーに、それぞれ"他の属性"を様々な組み合わせで付け足したものである。例えば、{社員番号、連番},{社員番号、連番、名前},{社員番号、連番、名前、性別、電話番号、住所}

属性集合の大きさ観点から見ると、*主キー*＞*候補キー*＞*スーパーキー*と言う関係が見て取れる。

#２、スーパータイプとサブタイプについて
##スーパータイプについて
取引先（取引先番号(p)、取引先名）
仕入先（取引先番号(p)、買掛金残高）
得意先（取引先番号(p)、売掛金残高）
このような、各リレーションが存在する時、”取引先”と言う一括りの中に、”仕入先”や”得意先”が存在するといったイメージ。

##サブタイプ
サブタイプの関係性を考える際に考慮しなくてはならない点がある。と言うのは、
１、”複数のサブタイプの中のいずれか１つにしか属せないのか”
２、”複数のサブタイプに属することが可能なのか”
の２点。そして、その違いによって**排他的サブタイプ**と**共存的サブタイプ**に分けることができる。
###排他的サブタイプ
複数のサブタイプの中のいずれか１つにしか属することができない
例えば、
スーパータイプ・・・取引先（取引先番号(p)、取引先名）
サブタイプ・・・仕入先（取引先番号(p)、買掛金残高）
サブタイプ・・・得意先（取引先番号(p)、売掛金残高）
このようなリレーションが存在する場合、
『取引先は、仕入先か得意先かどちらか一方にしか登録できない』
『仕入先かつ得意先の取引先は存在しない』
といったような条件が設けられている場合、排他的サブタイプと判断する。
[概念データモデルで排他的サブタイプを表現]
![スクリーンショット 2019-02-07 21.18.25.png](https://qiita-image-store.s3.amazonaws.com/0/243679/6a123151-74b4-8ecb-d024-2774cadb0a1c.png)

###共存的サブタイプ
複数のサブタイプに属することが可能
例えば、
スーパータイプ・・・取引先（取引先番号(p)、取引先名）
サブタイプ・・・仕入先（取引先番号(p)、買掛金残高）
サブタイプ・・・得意先（取引先番号(p)、売掛金残高）
このようなリレーションが存在する場合、
『取引先は、仕入先か得意先のどちらか一方、または両方に登録することができる』
といったような条件が設けられている場合、共存的サブタイプと判断する。
[概念データモデルで共存的サブタイプを表現]
![スクリーンショット 2019-02-07 21.20.26.png](https://qiita-image-store.s3.amazonaws.com/0/243679/921ca18e-fed1-e899-8b76-8cc8f7698bf1.png)

#３、トランザクション管理機能
##トランザクション管理機能とは？
DBMS内の機能の１つ。障害が発生してもデータに矛盾が怒らないようにする機能の事。
##トランザクションとACID特性
###トランザクションとは？
トランザクションとは、ユーザーから見た一連の処理のまとまりの事。つまり、銀行振込の例で考えると、『山田さんが佐伯さんの口座に２万円を振り込んだ場合」、「山田さんの口座の預金額を２万円減算して、佐伯さんの預金額に２万円の加算を行う。」といった一連の処理のまとまりの事。
###ACID特性とは？
トランザクションはACID特性を持つ。このACID特性を持つことによってトランザクションの信頼性が得られる。ACID特性とは、以下の４つの性質の頭文字をとったものである。

|ACID特性|意味|実現する機能|
|:-----------------:|:------------------:|:------------------:|
|原子性|トランザクションは完全に実行されるか、全く実行されないかのどちらかでなければならない|コミットメント制御|
|一貫性|トランザクションは、データベース内部で生合成を保たなければならない|排他制御（同時実行制御）|
|独立性|トランザクションは、同時に実行しているほかのトランザクションからの影響を受けず、並行実行の場合も単独で実行している場合と同じ結果を返さなければならない|排他制御（同時実行制御）|
|耐久性|トランザクションの結果は、障害が発生した場合でも、失われないようにしなければならない|障害回復|

###コミットメント制御とは
コミットメント制御とは、トランザクションのACID特性の１つである原始性を確保する為の機能で、データベースへの更新を確定する**コミット**と、データベースへの更新を取り消す**ロールバック**からなる。つまり、**コミットメント制御**によって（コミット＋ロールバック）によって、DBMSの原子性が確保、実現されているということになる。
####コミットとロールバック
トランザクションないの全ての処理が実行された際、その更新結果を確定・決定する事を”**コミット**”と言う。また、トランザクションが完了していない状態で何らかのエラーが発生した場合に、処理を取り消してトランザクション開始以前の状態に戻すことを”**ロールバック**”と言う。

###排他制御（同時実行制御）とは
トランザクションの一貫性および独立性を確保する為の機能が排他制御と言う。DBMSには複数のトランザクションを並行実行する機能を持たせる必要がある。しかし、複数のトランザクションを自由に並行実行させてしまった場合、同じテーブルに対して複数のトランザクションからアクセスを受け付けてしまった時に同時に更新や変更が行われてしまうと、個々のトランザクションが他のトランザクションからの影響を受けてしまい、タイミングによっては全く期待した結果とは異なった結果を抽出してしまうことになる。
それを回避するためにDBMSにはトランザクションスケジューリング機能によって、並行実行されているトランザクションを直列実行可能になるように制御している。

※直列実行可能※２つのトランザクションを並列実行した場合と、２つのトランザクションを逐次実行した場合の結果が同一になる場合。トランザクションスケジュールは直列化可能性が保証されていると言う。

この制御機能を**排他制御**と言う。排他制御は主に、データベースの**ロック**によって実現している。この**ロック**と言う機能は他のトランザクションからのアクセスを受け付けなくする（あるトランザクションが占有する）機能である。

####ロックの種類
ロックの種類には”占有ロック”と”共有ロック”がある。
#####共有ロック(リードロック)
トランザクションは、データを読む前に共有ロックを実施する。
他のトランザクションからの共有ロックは許すが、占有ロックは許さない。
#####占有ロック(ライトロック)
トランザクションは、データを書き込む前に占有ロックを実施する。
他のトランザクションからの共有ロックも占有ロックも許さない。

####ロックの粒度
ロックの対処となるデータの単位の事を**ロックの粒度**と言う。ロックの粒度には"タプル""ブロック""テーブル""データベース"などがある。
ロックの粒度が大きくなるにつれて、ロックの制御は容易になるがロックの待ち時間が長くなる。
ロックの粒度が小さくなるにつれて、ロックの待ち時間は短縮できるがロックの制御処理が複雑になる。

####2相ロッキングプロトコル
ただロックを使うだけでは直列可能であることの保署にならないため、２相を用いる。
２相ロッキングプロトコルとは、トランザクションの実行をする前に、読み込み、書き込みを行うデータにロックをかけておき、終了後にロックを解除すると言うものである。この仕組みがデッドロックを生じさせる。

####デッドロック
２つのトランザクションが互いの処理に必要なデータをロックし合っているために、処理が続行できなくなった状態の事。