繰返項目などの集合要素を持たないもの。
全ての非キー属性が、主キー全体に対して関数属性
(完全関数従属)
であるもの。
全ての非キー属性が、推移的に関数従属でないもの。
第2正規形から、
主キーに推移的に関数従属する属性を分離して得られる。
第3正規形は、候補キーとそれに従属する属性からなるか、
または属性が任意の候補キーの要素である。
すべての属性が候補キーに
完全関数従属であり、
部分関数従属も
推移関数従属も認めない。
ボイス・コッド正規形は必ず第3正規形であるが、
非キー属性からキー属性に対する関数従属性も認めていない点が異なる。
(言い方を変えると、候補キーが一つしか無いならば、
当然、そのキー属性は非キー属性からの関数従属性が無いわけで、
この時、第3正規形はボイス・コッド正規形を条件を満たす。)
多値従属性のある関係を分解して得る。
例えば、製品コードに複数の部品コードと複数の色コードが対応する場合、
これが一つのテーブルとして設計されていると、
「ある製品に対して、部品は決まったが、色が決まっていない」という時、
レコードを追加することが出来ない。
このような問題は、(製品コード、部品コード)、(製品コード、色コード)
という2つのテーブルに分解しておくことで解決する。
結合従属性がある関係を
全て分解しきって得る。
例えば、製品コード、仕入先コード、メーカーコードが
主キーであるテーブルが設計されていると、
製品、仕入先、メーカーの組合せの全てが決まらないと、
レコードを追加することが出来ない。
このような問題は、(製品コード、仕入先コード)、
(製品コード、メーカーコード)、
(仕入先コード、メーカーコード)という
3つのテーブルに分解しておくことで解決する。
ここで、例えば(仕入先コード、メーカーコード)というテーブルが無いと、
3つのテーブルを結合して
(製品コード、仕入先コード、メーカーコード)というテーブルを復元した時、
有り得ない仕入先とメーカーの組合せまで作られてしまい、
結合従属性が満たされなくなる点に注意すること。
レコードを一意に識別できる属性のうち、
どれか一つでも欠ければ一意性が確保できなくなるもの。
論理的には、一つのテーブルに候補キーは複数存在し得る。
候補キーのうち、
識別子として最も適切であるとして、設計者により、ただ一つ選択・定義されたもの。
主キーに対しては、常に一意にレコードを識別できるよう、
NULL状態(未登録状態)を認めない制約(非NULL制約)を与える。
ある属性Xの値を決めた時、他の属性Yの値が一意に定まる時、
YはXに関数従属であると言う。
例えば、[社員番号]の値を決めると、[社員氏名]の値(名前)は一意に決まる。
この時、[社員氏名]は[社員番号]に関数従属である。
YがXに関数従属である時、X→Yと表記する。
X→Yで、かつ、YがXのいかなる射影についても
関数従属が成り立たないこと。
たとえば、属性X=(x1,x2,x3,x4) と、4つの要素からなる時、
この「要素の真部分集合」たとえば(x1,x2,x3)とか(x2,x4)から
Yを一意に定めることが出来てしまったら、
X→Yは完全関数従属とは言えない
(部分関数従属である)。
(x1,x2,x3)だけからYが決まるなら、x4はYを決めるには
あっても無くても良い要素である。
主キーの中からレコードを一意に決めるのに
「あっても無くても無い要素」を除いた形式が
第二正規形となる。
具体例で示す。
[生徒番号・試験科目コード]という連結属性Xに対して、
[科目得点]Y1は、[生徒番号]だけ、もしくは[試験科目コード]だけが決まっても、
一意には値が定まらない。つまり、
従って、[科目得点]Y1は、[生徒番号・試験科目コード]Xに対して、
完全関数従属である。
一方、[生徒氏名]Y2は、[生徒番号・試験科目コード]Xの射影である
[生徒番号]だけが決まれば、一意に値が定まってしまう。つまり、
従って、[生徒氏名]Y2は、[生徒番号・試験科目コード]Xに対して、
完全関数従属では無い。
属性Xの一部の要素にYが従属するとき、YはXに部分関数従属であると言う。
{X1,X2}→Yであり、X1→Yであれば、
Yは{X1,X2}に部分関数従属する。
既存の関数従属から、
新たな関数従属を得られる時、推移的関数従属がある、と言う。
例えば、[取引コード]X→[取引先会社コード・取引先会社名]Yという関数従属関係がある時、
よく見ると、Yの中で、[取引先会社名]Y2は、
やはりYの中の[取引先会社コード]Y1に関数従属である。
つまり、X→Yという関数従属は、詳しく見ると
Y1→Y2という関数従属を含んでいる。
(X→Y1→Y2、という関数従属関係の連鎖が見られる。)
関数従属性は、
多値従属性の一種である。
多値従属性は、結合従属性の一種である。
分解後の表を結合すると元の表に戻る性質。
全ての正規化は、結合従属性を維持するように行われる。
(分解によって情報が失われないように表を分解していく。)
◆第一正規化
◆非正規形
- 納入伝票 (納入伝票番号、 日付、倉庫コード、倉庫名、倉庫住所、
一時保管場所候補1、一時保管場所候補2、
製品コード1、製品名1、製品級1、製品幅1、製品重量1、納入数量1、
製品コード2、製品名2、製品級2、製品幅2、製品重量2、納入数量2、
製品コード3、製品名3、製品級3、製品幅3、製品重量3、納入数量3)
◆第二正規化
◆第一正規形
- 納入伝票 (納入伝票番号、日付、倉庫コード、倉庫名、倉庫住所)
- 一時保管場所 (納入伝票番号、一時保管場所候補)
- 納入製品 (納入伝票番号、製品コード、 製品名、製品級、製品幅、製品重量、納入数量)
◆第三正規化
◆第二正規形
- 納入伝票 (納入伝票番号、日付、倉庫コード、倉庫名、倉庫住所)
- 一時保管場所 (納入伝票番号、一時保管場所候補)
- 納入製品 (納入伝票番号、製品コード、納入数量)
- 製品 (製品コード、製品名、製品級、製品幅、製品重量)
◆第四正規化
◆第三正規形
- 納入伝票 (納入伝票番号、日付、倉庫コード)
- 倉庫コード (倉庫コード、倉庫名、倉庫住所)
- 一時保管場所 (納入伝票番号、一時保管場所候補)
- 納入製品 (納入伝票番号、製品コード、納入数量)
- 製品 (製品コード、製品名、製品幅、製品重量)
- 製品級 (製品級、製品幅、製品重量)
P[A=B]Q(等値結合)、ある列に注目して共通の行を結合する。
P(X,A)={(x,a1),(y,a2),(z,a3)}、Q(B,P)={(a3,p),(a2,q)}
R(X,A(orB),P)={(y,a2,q),(z,a3,p)}
R(X,A(orB),P)={(x,a1,NULL),(y,a2,q),(z,a3,p)}
P(X,A)
X
A x a1 y a2 z a3
Q(B,P)
B
P a3 p a2 q
R(X,A,P)
X
A
P x a1 NULL y a2 q z a3 p
2つの表から、あり得るすべての組み合わせを作ること。
R×S
R={x,y,z}、S={a,b}→
R×S={(x,a),(x,b),(y,a),(y,b),(z,a),(z,b)}
「特定の列を取り出す」
P={(x,a,p),(y,b,q),(z,c,r)}→選択:P'={(x,a,p),(y,b,q)}
※第1、第2行を取り出した。
「特定の列を取り出す」
P={(x,a,p),(y,b,q),(z,c,r)}→射影:P'={(x,p),(y,q),(z,r)}
※第1、第3列を取り出した。
少なくとも一方の表に存在する行をすべて抽出すること。
P-Q「Pに属し、Qに属さない要素」
P={(x,a),(y,b),(z,c)}、Q={(z,c)}、P-Q={(x,a),(y,b)}
P・Q「PにもQにも属する要素」
P={(x,a),(y,b),(z,c)}、Q={(z,c)}、P・Q={(z,c)}
P・Q=P-(P-Q)