DBMS - データベースの正規化

こんにちは、データベースの熱心な愛好家たち!今日は、データベースの正規化の世界への興味深い旅に出発しましょう。あなたの近所の親切なコンピュータサイエンスの教師として、データベース設計におけるこの重要な概念を案内します。プログラミングが初めての人でも心配しないでください。基礎から始めて、段階的に進めます!

DBMS - Database Normalization

データベースの正規化の紹介

クローゼットを整理するとき、すべての服を一个大山にするわけではありませんよね?もちろん、それではいけません!服をタイプ、色、季節ごとに整理します。データベースの正規化も非常に似ています。データを効率的に整理し、重複を減らすことが目的です。

関数依存性

まず、基本的な概念から始めましょう:関数依存性。

関数依存性とは?

関数依存性(Functional Dependency、FD)は、関係内の二つの属性間の関係で、一つの属性が他の属性を決定するものです。

学生データベースを例にとってみましょう:

Student_ID Name Age Course
101 Alice 20 Math
102 Bob 21 Physics
103 Charlie 19 Chemistry

ここで、Student_IDはName、Age、Courseを関数的に決定しています。これを以下のように表します:

Student_ID → Name, Age, Course

これは、Student_IDを知れば、その学生のName、Age、Courseを決定できることを意味します。

アームストロングの公理

次に、アームストロングの公理について話しましょう。これらは関数依存性の基本則で、データベース関係の「物理の法則」と思ってください!

  1. 反射性:YがXの部分集合である場合、X → Y
  2. 増加性:X → Yの場合、XZ → YZ
  3. 透過性:X → YおよびY → Zの場合、X → Z

これらは複雑に聞こえるかもしれませんが、論理関係を形式的に表現したものです。後で応用を見ていきましょう!

平凡な関数依存性

平凡な関数依存性は、右側の属性が左側の属性の部分集合である場合です。例えば:

Student_ID, Name → Student_ID

これは平凡です because 知ってる Student_IDとNameは常に Student_ID(もうそこにあります!)を教えてくれます。

正規化

さて、私たちの授業の核心に進みましょう:正規化。正規化はデータを整理して重複と依存性を最小限にするプロセスで、データベースの整理と似ています!

第一正規形(1NF)

第一正規形は正規化の基本レベルです。1NFを達成するためには:

  1. 繰り返しグループを排除します
  2. 関連データのそれぞれのセットに対して別のテーブルを作成します
  3. 各関連データのセットにプライマリキーを割り当てます

例を見てみましょう:

1NF之前的:

Order_ID Product Quantity
1 Apple, Banana 2, 3
2 Orange, Grape 1, 4

1NF之后的:

Order_ID Product Quantity
1 Apple 2
1 Banana 3
2 Orange 1
2 Grape 4

繰り返しグループを排除したように、もっときれいになりました!

第二正規形(2NF)

2NFを達成するためには:

  1. 1NFであること
  2. 部分的依存を除去すること

例を見てみましょう:

Student_ID Course_ID Course_Name Instructor
101 C1 Math Prof. Smith
102 C2 Physics Prof. Johnson

ここで、Course_NameとInstructorはCourse_IDに依存しており、Student_IDに依存していません。これを二つのテーブルに分けます:

テーブル1: Student_Course

Student_ID Course_ID
101 C1
102 C2

テーブル2: Course

Course_ID Course_Name Instructor
C1 Math Prof. Smith
C2 Physics Prof. Johnson

第三正規形(3NF)

3NFを達成するためには:

  1. 2NFであること
  2. 運搬依存を除去すること

例を見てみましょう:

Employee_ID Department Department_Head
101 Sales John
102 Marketing Sarah

ここで、Department_HeadはDepartmentに依存しており、Employee_IDに依存しています。これを分けます:

テーブル1: Employee

Employee_ID Department
101 Sales
102 Marketing

テーブル2: Department

Department Department_Head
Sales John
Marketing Sarah

ボイース・コッド正規形(BCNF)

BCNFは3NFのやや強化版です。BCNFにするためには:

  1. 3NFであること
  2. すべての依存 X → Y について、Xが超キーであること

例を見てみましょう:

Student Subject Professor
Alice Math Prof. Smith
Bob Physics Prof. Johnson

この場合、(Student, Subject) → ProfessorおよびProfessor → Subjectです。BCNFにするために分けます:

テーブル1: Student_Professor

Student Professor
Alice Prof. Smith
Bob Prof. Johnson

テーブル2: Professor_Subject

Professor Subject
Prof. Smith Math
Prof. Johnson Physics

それで、データベースの正規化の基本をカバーしました。覚えておいてください、正規化は重要ですが、性能のために非正規化が有用な場合もあります。特定のニーズに応じて適切なバランスを見つけることが重要です。

このガイドが役立つことを願っています。実践は完璧を生む!サンプルデータベースを自分で正規化してみてください。質問があれば、ためらわずに聞いてください。楽しい正規化を!

Credits: Image by storyset