DBMS - データベースの正規化
こんにちは、データベースの熱心な愛好家たち!今日は、データベースの正規化の世界への興味深い旅に出発しましょう。あなたの近所の親切なコンピュータサイエンスの教師として、データベース設計におけるこの重要な概念を案内します。プログラミングが初めての人でも心配しないでください。基礎から始めて、段階的に進めます!
データベースの正規化の紹介
クローゼットを整理するとき、すべての服を一个大山にするわけではありませんよね?もちろん、それではいけません!服をタイプ、色、季節ごとに整理します。データベースの正規化も非常に似ています。データを効率的に整理し、重複を減らすことが目的です。
関数依存性
まず、基本的な概念から始めましょう:関数依存性。
関数依存性とは?
関数依存性(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を決定できることを意味します。
アームストロングの公理
次に、アームストロングの公理について話しましょう。これらは関数依存性の基本則で、データベース関係の「物理の法則」と思ってください!
- 反射性:YがXの部分集合である場合、X → Y
- 増加性:X → Yの場合、XZ → YZ
- 透過性:X → YおよびY → Zの場合、X → Z
これらは複雑に聞こえるかもしれませんが、論理関係を形式的に表現したものです。後で応用を見ていきましょう!
平凡な関数依存性
平凡な関数依存性は、右側の属性が左側の属性の部分集合である場合です。例えば:
Student_ID, Name → Student_ID
これは平凡です because 知ってる Student_IDとNameは常に Student_ID(もうそこにあります!)を教えてくれます。
正規化
さて、私たちの授業の核心に進みましょう:正規化。正規化はデータを整理して重複と依存性を最小限にするプロセスで、データベースの整理と似ています!
第一正規形(1NF)
第一正規形は正規化の基本レベルです。1NFを達成するためには:
- 繰り返しグループを排除します
- 関連データのそれぞれのセットに対して別のテーブルを作成します
- 各関連データのセットにプライマリキーを割り当てます
例を見てみましょう:
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を達成するためには:
- 1NFであること
- 部分的依存を除去すること
例を見てみましょう:
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を達成するためには:
- 2NFであること
- 運搬依存を除去すること
例を見てみましょう:
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にするためには:
- 3NFであること
- すべての依存 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