リレーショナルモデル

###リレーショナルモデル(RDB)とは？
1.集合論に立脚したモデル
2.データをリレーションで表現
-2次元の表形式で表現
3.データ独立性が高い
-可変長のデータや複雑なデータ構造のデータには不向き
（各セルで複数の値を持てない）
-可変長のデータ = 一人の人物が複数の情報を保有している場合
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/2cefc563-7162-c272-e015-dc9a5fa6c5f0.png)
####リレーションスキーマ
-リレーションのデータ構造
（一度定義したら基本的に変更されない）
-リレーション名、属性
####インスタンス
-スキーマにもとずいて格納された実際のデータ
（利用に応じて追加、削除、変更できる）
####ドメイン
-ある属性が取り得る値の領域を表した集合のこと
####リレーション
-タプルの集合
-数学的に定義するとドメインの直積の部分集合であるという事が言える
####リレーション名
-テーブル名
####タプル、レコード
-リレーションに属する個々の値
-テーブルの行に相当
####カラム、フィールド
-テーブルの列に相当
####属性
-リレーションに含まれる各データ項目のこと
-カラムの見出しに相当
####値
-テーブルのデータ（数値、文字列）

---
###リレーションの濃度
-タプルの総数
###リレーションの次数
-属性の数
![Untitled(2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/5772b9a1-2624-61c9-e79a-0b7e6e3e7112.png)

---
###正規化
-データの一貫性の維持と効率的なデータアクセスを可能にする関係設計へ導くための方法
-正規化された表のことを正規形という
-データの追加、更新、削除する際の不整合が起きる機会を減らすことができる。
-更新時異常を防ぐ
####更新時異常
-正規化されていないリレーションは、データ更新時にデータの不整合が発生する場合がある為、正規化によりデータの冗長性をなくし、データの追加、更新、削除時の不整合(更新時異常)が発生する機会を減らす事ができる
1.挿入時異常
2.削除時異常
3.修正時異常
※キー制約を確認し、情報無損失分解、情報損失分解を行う。

#####情報無損失分解
分解後の(R)を自然結合することで、分解前の情報に戻す
#####情報無損失分解
誤った分解を行う事により発生する為、関数従属性に注目しスキーマに複数の事象の情報が混在しないようにする

---
####正規化の段階
第一正規化 > 第二正規化 > 第三正規化 > ボイス・コッド正規化 > 第四正規化 > 第五正規化

####完全関数従属
複合キー(A,B)が決まる事により、ある属性(C)の値が一意に決まった
属性(C)は複合キー全体に対して関数従属している
![dio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/fb447b31-38c6-8886-e245-1ba3d857f046.png)

####部分関数従属
複合キーの一部に対して関数従属している
(複合キーの一部が決まる事で、決定される値)
第二正規化では、部分関数従属を取り除く
####関数従属性
ある属性の値が決まると別の属性の値が決まる関係
属性Aの値が決まる事によって、ある属性Bの値が決まる事を属性Bは属性Aに関数従属しているという。
{A}→{B}
ある属性Xの値が決まれば、自ずと属性Yの値が決まる時、yはXに関数従属している。(X⇒Yにおいて、Xを決定項、Yを従属項という)
情報を分解する時は、関数従属性に着目して分解を行う必要がある
####関数従属性保存
第一正規化、第二正規化、第三正規化
####リレーションスキーマの分解
1.更新による異常が発生するのを防ぐ為に、情報無損失分解を行う
2.関数従属性に注目する
####非正規形
セルの結合が行われていたり、セルに複数行の値が入っていること
####第一正規形
-繰り返しの項目を別のタプルとして独立させること
（テーブルの全ての行と列に値が入っていること）
####主キー(Primary key)
主キーは候補キーの中からより適切なものを設計者が一つ選ぶ
-テーブルの行を一意に識別できる属性のこと
・他の行と値が重複しない
・NULL(空値)ではない
-0や空白はNULLではない
-Primary keyはレコードを区別するフィールド
(フィールドの値が重複しないものをPrimary keyに指定する)
####外部キー(Foreign key)
-他の表と関連付けされているキーで、外部キーの参照先は主キーである
####候補キー
-特定の行(タプル)を一意に識別できる属性の組で最小のもの
スーパーキー
-行を一意に特定できる属性や属性の組み合わせの集合
####複合キー
複数の属性から構成された候補キー
####非キー属性
いかなる候補キーにも含まれない属性の事

####第二正規形(第一正規形を満たし部分関数従属がない形)
複合キーを構成する属性への部分関数従属の除去
➡第一正規形のリレーションスキーマから部分関数従属をなくすように情報無損失分解すること
(第一正規形を満たし、部分関数従属がない形)
部分関数従属がない
非キー属性が(R)の各候補キーに完全関数従属している

####第三正規形
第二正規形から推移的関数従属を除いた形
####推移的関数従属
-候補キーに関数従属する属性に推移的に関数従属する属性
![22キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/d915c97f-3731-4b13-8c66-e5ba9ddafb44.png)

####ボイス・コッド正規形
第三正規形で決定項がスーパーキーでない関数従属性がある場合、それを取り除く
リレーションスキーマ(R)の全ての関数従属性A→Bにおいて、A→Bは自明な関数従属性である、AがRのスーパーキーである
※自明な関数従属:X→YにおいてYがXの部分集合の場合
※スーパーキー:候補を含む属性集合

####ボイス・コッド正規形であるかの判定
関数従属が自明な関数従属もしくは、決定項がスーパーキーであるかを確認し、どちらかを満たしているか満たしていないかで判別する。

####高次の正規化のメリットとデメリット
-メリット
リレーションスキーマ(R)の分解をしていくことで、更新時異常の原因であった1つのリレーションスキーマ(R)に複数の情報が混在することが少なくなる為、更新時異常を回避しやすくなる
-デメリット
ボイス・コッド正規形以降では、関数従属性が失われる可能性がある
(制約が保存されない)
細かく分割することで、データ検索時に結合の負担が大きくなり、実行速度が遅くなることがある

---
###整合性制約
ドメイン制約
属性値はドメインの要素でなければいけない
同じ属性の属性値は同じドメイン（数値、文字列）でなければならないキー制約
キー制約が指定された属性は、複数の行で同一の値を持つことが許されない
NOT NULL制約
-NOT NULL制約が指定された属性は、その値がNULL(空値)をとることを許されない
参照整合性制約
-他のテーブルを参照する属性に課せられる制約
・他のテーブルの行の値を参照する場合に、参照先の行が必ず存在しなければならない
・参照されている行を削除する時、参照している行が存在する間は削除することができない