データベースの正規化 (Normalization) とは、リレーショナルデータベースの設計において、データの冗長性を排除し、整合性を保ち、データ操作(更新、挿入、削除)を効率的に行うプロセスです。正規化は、正規形 (Normal Form) と呼ばれる一連のルールに従って行われます。
正規化の目的
- データの整合性の保持: データの一貫性を保ち、矛盾が生じるのを防ぎます。
- データの冗長性の排除: 同じデータが複数の場所に重複して存在することを防ぎ、記憶領域の節約と更新時の手間を減らします。
- データ操作の適正化: データ操作(更新、挿入、削除)の際に発生する異常(更新時異常、挿入時異常、削除時異常)を排除し、効率的なデータ管理を実現します。
関数従属性について
正規化を理解する上で重要な概念が関数従属性 (Functional Dependency) です。これは、ある属性の値が決まると、別の属性の値が一意に決まる関係を指します。A → B
と表記し、「AがBを関数決定する」または「BはAに関数従属する」と読みます。
完全関数従属性 (Full Functional Dependency)
ある属性が、主キーの全ての項目によって関数決定される関係です。主キーの一部では決定されません。
部分関数従属性 (Partial Functional Dependency)
ある属性が、主キーの一部によって関数決定される関係です。複合主キーの場合に問題となります。
推移関数従属性 (Transitive Functional Dependency)
ある属性が、主キー以外の属性を介して関数決定される関係です。A → B
かつ B → C
で、A → C
となる場合、C
は A
に推移関数従属すると言います。
第一正規形 (1NF: First Normal Form)
非正規形から、繰り返し部分(多値属性)を排除し、全ての属性が単一の値を持つようにした形です。
変換方法
- 非正規表に主キーを設定します。
- 繰り返し部分を分離し、新しいテーブルを作成します。
- 分離したテーブルに主キーを設定し、元のテーブルとの関連付けのために外部キーを設定します。
第二正規形 (2NF: Second Normal Form)
第一正規形から、部分関数従属性を排除した形です。複合主キーを持つテーブルが対象となります。
変換方法
- 複合主キーを持つテーブルを探します。
- 主キーの一部にのみ関数従属している項目(属性)を、その主キーの一部を主キーとする新しいテーブルとして分離します。
- 元のテーブルには、分離したテーブルの主キーを外部キーとして残します。
第三正規形 (3NF: Third Normal Form)
第二正規形から、推移関数従属性を排除したものです。
変換方法
- 主キー以外の項目で、他の主キー以外の項目に関数従属している項目(推移関数従属している項目)を探します。
- 推移関数従属している項目を、その決定元となる主キー以外の項目を主キーとする新しいテーブルとして分離します。
- 元のテーブルには、分離したテーブルの主キーを外部キーとして残します。
正規化は、データベースのパフォーマンスや複雑性とのトレードオフの関係にあります。過度な正規化は、テーブル結合の増加によるパフォーマンス低下を招くこともあるため、システムの要件に応じて適切な正規化レベルを選択することが重要です。