データベースを正規形に適合しているか分析するってことは、テーブルの構造やテーブル同士の関係、属性間の依存関係をチェックするってことだよ。分析のメインの目的は、正規化違反を見つけて、それがパフォーマンスや整合性、データの扱いやすさにどう影響してるか評価すること。
簡単に言うと、これは会計監査みたいなもん。お金が適当に置かれてないか、ちゃんと必要な費目ごとに分けられてるかチェックする感じ。
データベース分析の実践的アプローチ
どんなデータベースでも、まずは正規形ごとに3つの基本的な質問をするところから始めるよ。
例えば、倉庫のデータベースがあって、こんな構造のテーブルがあるとしよう:
| product_id | product_name | supplier_name | supplier_phone | stock_quantity |
|---|---|---|---|---|
| 1 | クギ | ストロイコンプレクト | +12301112233 | 150 |
| 2 | ネジ | クレペジョプロ | +12306667788 | 200 |
| 3 | ナット | ストロイコンプレクト | +12301112233 | 100 |
このテーブルが正規形に合ってるかどうやってチェックする?
1NF(第1正規形)を思い出してみよう:
- 各セルには1つの値だけが入ってる。
- 同じデータ型の重複カラムがない。
この例だと1NF違反はないね。各セルはアトミックな値だし。つまり、このテーブルは1NFになってる。やったね!次に進もう。
2NF(第2正規形)は:
- 1NFになっている。
- すべての非キー属性が完全に主キー全体に依存している(部分的な依存がない)。
このテーブルだと、supplier_nameとsupplier_phoneはproduct_id(主キー)だけに依存してる。でも、同じサプライヤーの名前と電話番号が複数行に重複してるのが分かるよね。
2NFにするには、テーブルを2つに分けるのがいい:
Productsテーブル:
| product_id | product_name | supplier_id | stock_quantity |
|---|---|---|---|
| 1 | クギ | 1 | 150 |
| 2 | ネジ | 2 | 200 |
| 3 | ナット | 1 | 100 |
Suppliersテーブル:
| supplier_id | supplier_name | supplier_phone |
|---|---|---|
| 1 | ストロイコンプレクト | +78901112233 |
| 2 | クレペジョプロ | +78906667788 |
これでサプライヤーは1回だけ出てくるし、テーブル同士は外部キーsupplier_idでつながってる。
3NF(第3正規形)は:
- 2NFになっている。
- すべての非キー属性が主キーだけに依存していて、他の非キー属性には依存していない。
正規化したProductsとSuppliersテーブルには推移的な依存関係はない。つまり、3NFになってる!
実践課題
例えば、元の「大学」テーブルがあるとしよう:
| student_id | student_name | course_name | professor_name | professor_email |
|---|---|---|---|---|
| 101 | Otto Lin | スウガク | Peter Pen | pen@university.com |
| 102 | Anna Song | ブツリ | Alex Sid | sid@university.com |
| 103 | Otto Lin | ブツリ | Alex Sid | sid@university.com |
- このテーブルが正規形に合ってるかチェックしよう。
- 必要なら1NF、2NF、3NFにしてみよう。
解答
STEP 1: 1NFチェック
このテーブルはすでに1NF:各セルは1つの値だけ。
STEP 2: 2NFチェック
2NF違反がある:教授(名前とメール)の情報が重複してる。これを別テーブルに分けよう:
Studentsテーブル:
| student_id | student_name |
|---|---|
| 101 | Otto Lin |
| 102 | Anna Song |
Coursesテーブル:
| course_id | course_name | professor_id |
|---|---|---|
| 1 | スウガク | 1 |
| 2 | ブツリ | 2 |
Professorsテーブル:
| professor_id | professor_name | professor_email |
|---|---|---|
| 1 | Peter Pen | pen@university.com |
| 2 | Alex Sid | sid@university.com |
Enrollmentsテーブル:
| enrollment_id | student_id | course_id |
|---|---|---|
| 1 | 101 | 1 |
| 2 | 102 | 2 |
| 3 | 103 | 2 |
STEP 3: 3NFチェック
新しい構造には推移的な依存関係がない。テーブルは3NFになってる!
実践的なアドバイス
- 必要以上に理想を追い求めない。 過剰な正規化はクエリを複雑にしちゃうこともある。
- 分析は探偵気分で! 重複や余計な依存、他の「異常」を探してみよう。
- パフォーマンスも忘れずに。 正規化はデータのきれいさと処理速度のバランスが大事。
これでデータベースの問題を見つけて解決できるようになったから、どんな規模のDBでも「監査」できるはず。覚えておいて:いいデータベースは機能的なだけじゃなくて、きれい(正規化されてる)なプロジェクトでもあるんだ。
GO TO FULL VERSION