DB
正規化
DB設計

DB設計と正規化

データベース設計の流れ

概念設計 -> 論理設計 -> 物理設計の順で行われる

概念設計

  • 業務で扱う情報を整理する
  • システム化に影響を受けない
  • データを永続化しない範囲も含まれる

論理設計

各キーや関係性が関係性が確立することが目標

  • データを論理的に構造化する
  • 正規化や非正規化を行う
  • データを永続化する範囲に限られる

物理設計

  • データの型やフィールド名を決定する
  • インデックスの設計を行う
  • CPUやメモリ等を決定する

正規化

冗長を排除し、データの独立性(関係従属性のことではなく、不必要な依存のこと)を高める更新異常が発生しないようにする
第1 ~ 第5正規形まで定義されている(ボイス・コッド正規形は3.5正規形と呼ばれる)

  • 冗長化(じょうちょうか)とは、システムの一部に何らかの障害が発生した場合に備えて、障害発生後でもシステム全体の機能を維持し続けられるように、予備装置を平常時からバックアップとして配置し運用しておくこと。

「1事実1箇所」(1 fact in 1 place)にすることが正規化の目的

一つの事実が、一つのテーブルの1行の中にだけ存在していること。
あるいは、一つの従属性(事実関係)だけが一つのテーブルに実装されていること。

更新時異常

正規化が不十分だと、挿入・更新・削除する際に様々な異状が発生すること。
つまり、冗長性がある状態のこと。

情報損失分解

分解しても分解前の関係を復元できる分解のこと。

非正規形

リレーションRの属性の中に、単一でない値(一つの属性の中に繰り返し項目があるもの)が含まれている
(例)一つのレコードに対し、複数の商品のデータが入ってしまっているような場合

第一正規形

リレーション R のすべての属性が、単一値である。
(例)全てのレコードに対し、1レコード1カラムに対応するような場合
目的 : 全てのレコード・カラムを1:1対応させるような表にする(まとめずに対応表をつくる)

第二正規形

リレーションRが次の条件を満たす

  • 第一正規形であること
  • すべての非キー属性は、いかなる候補キーにも部分関数従属
していない(完全関数従属である)こと

目的 : 部分関数従属している部分を切り出すこと(部分的な塊の群を抜き出す)

what's 完全関数従属

  • 関数従属性「(候補キー:X)→(非キー属性:Y)」が成立する(YはXに関数従属している)
  • (候補キー:Xの真部分集合)→(非キー属性:Y)が成立しない

真部分集合 : ある集合に対して部分集合であるが、一致しないもの
(例)A={1, 2, 3}の場合、{1, 2, 3}以外の部分集合({1,2}等)

第三正規形

リレーション R が次の二つの条件を満たす。

  • 第2正規形であること
  • すべての非キー属性は、いかなる候補キーにも推移的関数従属
していない
  • 導出項目を削除する(例)商品の請求額など、計算によって得られる項目

推移的関数従属
 : 以下の条件を満たしている場合
集合Rの属性X, Y, Zにおいて、

  • X → Y(YはXに関数従属している)
  • Y → Xでない
  • Y → Z(ただし、ZはYの部分集合でない)

目的 : 推移的関数従属している部分を排除する(同じものが利用されている箇所をまとめて切り出す)

高次正規形

※ 基本的に第三正規形になった時点で第3.5正規化以降は満たされているので、ほとんどない(基本的にそうなる)。
むりくり後からデータ構造を変更した場合や、設計がおかしい場合などに限られる。

第3.5正規形 : ボイス・コッド正規形

第3正規形であり、非キー属性が、主キーに関数従属をしている場合は、ボイス・コッド正規形にする。

第4正規形

ボイス・コッド正規形を満たしており、一つのリレーションの中に、互いに独立な意味を持つ多値従属性(Aが決まるとBの集合が決まる関係)が存在する事

目的 : 第4正規化では、
自明ではない多値従属性「X→→Y|Z」を「X→→Y」「X→→Z」という
2つの自明な多値従属性に分解する

第5正規形

ボイス・コッド正規形を満たしており、まだ分割できるような状態(情報無損失分解)ができる状態のこと