データベース

データベース設計

More than 1 year has passed since last update.

・情報は可能な限り分割する方が良い。
「山田太郎」ではなく「山田」と「太郎」
「http:// or https://」と「それ以降」など。

・キーとなる列には、必ずコードやIDなど表記体系の定まった固定長文字列を用いる。
可変長文字列を用いてしまうと「やまだたろう」「山田太郎」「山田 太郎」など
同じ人物を指しているにも関わらず、データベース上では異なる値として扱われてしまうため。

・テーブル設計において、列には可能な限り NOT NULL制約を付加する。

・主キーは一部であってもNULLを含んではならない。

  • 第一正規形とはスカラ値の原則を満たすテーブルを作成すること。

    • 第一正規形を達成するには列持ちではなく行持ちで。
    • エンティティを複数持つ場合はテーブルを分割する。
  • 第二正規形とは完全関数従属のみのテーブルを作成すること。

    • 完全関数従属とは、「従属する列が《必要とする主キー》のみに紐付いている状態」のこと。※1

※1
例えば各企業の社員を管理するテーブルがあり、そこに【会社コード、会社名、社員ID、社員名、年齢、性別】のフィールドがあったとする。
この場合、社員名のフィールド(つまり、どの企業の何という名前の社員か)や年齢のフィールドを特定するには【会社コードと社員ID】を主キーにすることで一意な値が特定できる。
しかし会社名のフィールドのみは【会社コード】のみに従属しており、【社員ID】を主キーに設定する必要はありません。
従って、このようなテーブル設計は上記で定義されている「従属する列が《必要とする主キー》のみに紐付いている状態」ではない=完全関数従属の条件を満たしていないということがいえます。

  • 第三正規形とは推移的関数従属を無くしたテーブルを作成すること。
    • 推移的関数従属とは「同一テーブル内の段階的な従属関係」のこと ※2

※2
例えば社員を管理するテーブルがあり、そこに【社員ID、社員名、部署コード、部署名】のフィールドがあったとする。
この場合、主キーとして社員IDを指定することで、「その社員の指名、所属している部署のコード、所属している部署名」が判明します。つまり、社員IDと各フィールドには従属性があるということですね。

社員ID⇒社員名
社員ID⇒部署コード
社員ID⇒部署名

しかしその一方で部署コードと部署名の間にも明らかな従属関係が存在します。(部署コードを指定すれば部署名が分かる)

部署コード⇒部署名

従って、テーブル全体としては

【社員ID⇒部署コード⇒部署名】という二段階の関数従属があるということになります。
このように「同一テーブル内に存在する段階的な従属関係」のことを推移的関数従属と呼びます。

・【正規化】の逆操作は【結合】

・なぜ1つのセルに複数の値を入れてはダメなのか?~関数従属性~
データベースには「主キーを指定すれば、各フィールドの値が一意に決めることができる」というルールがあります。
関数従属性を保持するという観点からスカラ値の原則が提唱されています。