🐤

RDBの正規化を言葉で理解する(部分関数従属、完全関数従属、推移関数従属)

2024/07/11に公開

記事の内容

基本情報技術者試験の勉強中、RDBの正規化の定義に混乱したので、ここに私が理解した流れでそのまま記述します。
様々な記事の解説を自分なりに咀嚼し再表現しているため、誤っている内容があれば今後の読者のためにご指摘いただけると幸いです。

第一正規化

下記二つの原則に従うと第一正規化は完了です。

1. 属性に繰り返しが無い状態を目指す

  • ひとつの表において、同じ属性(列名)が複数回登場したり、ひとつの属性内に複数の値が格納されていない状態を目指す
  • NG例)レシート番号 | 発行日時 | 購入商品 | 購入商品 | 購入商品...
  • → 購入商品という属性はひとつだけにして、レシート番号と発行日時の重複には一旦目をつぶって、縦にデータを蓄積していく

2. 導出項目を属性として持たない

  • 導出項目:既存のデータから導き出すことができる項目のこと
  • NG例)発注製品 | 単価 | 数量 | 合計金額
  • → 合計金額は単価×数量で後で計算可能なので、属性として不要

第二正規化

第二正規化以降は用語から理解した方が個人的には理解しやすかったので、用語単位で整理しています。

関数従属

  • 一方の値が決まると、他方の値も一意に決まる関係(状態)

部分関数従属

  • 複合キーの一部の属性だけで、特定の非キー属性の値が一意に決まる状態
  • 部分関数従属の関係性をすべて別表に切り出すと、その表は完全関数従属になる
  • 主キーが1つの場合、部分関数従属の概念は存在しない

完全関数従属

  • 主キーの全ての属性によってのみ、特定の非キー属性の値が一意に決まる状態
  • 主キーは1つでも複合キーでも可
  • 部分関数従属がない状態だが、推移関数従属はあっても良い
  • 第二正規化では、完全関数従属をゴールとする

第三正規化

上記と同様に用語からの理解です。

推移関数従属

  • 特定の非キー属性によって、他の特定の非キー属性の値が一意に決まる状態
  • 第三正規化では、推移関数従属の関係にある属性を別表に切り出すことで、推移関数従属がない状態をゴールとする

Discussion