①の記事と②の記事で理論的なテーブル構造について学びました。
本記事では、具体例を用いて第三正規化まで行ってみましょう。
対象のテーブル
本記事では、以下のような例を考えます。
ブログの記事があり、それ1つに対して、ユーザは一回だけ"いいね"ができます。これをテーブルに表すと以下のようになります。
| ブログID | タイトル | 本文 | 作成日 | いいねユーザ名 | ユーザメールアドレス | いいねした日付 |
|---|---|---|---|---|---|---|
| 1 | タイトル1 | 本文1 | 2024/10/01 | ユーザA | a@example.com | 2024/10/01 |
| ユーザB | b@example.com | 2024/10/02 | ||||
| 2 | タイトル2 | 本文2 | 2024/10/02 | ユーザC | c@example.com | 2024/10/02 |
| 3 | タイトル3 | 本文3 | 2024/10/04 | ユーザA | a@example.com | 2024/10/04 |
| ユーザB | b@example.com | 2024/10/04 | ||||
| ユーザC | c@example.com | 2024/10/05 |
以上のテーブルに対して、第三正規化まで考えます。
非正規形
非正規形とは、1つのセルに複数の値が含まれている状態のことです。
| ブログID | タイトル | 本文 | 作成日 | いいねユーザ名 | ユーザメールアドレス | いいねした日付 |
|---|---|---|---|---|---|---|
| 1 | タイトル1 | 本文1 | 2024/10/01 | ユーザA | a@example.com | 2024/10/01 |
| ユーザB | b@example.com | 2024/10/02 | ||||
| 2 | タイトル2 | 本文2 | 2024/10/02 | ユーザC | c@example.com | 2024/10/02 |
| 3 | タイトル3 | 本文3 | 2024/10/04 | ユーザA | a@example.com | 2024/10/04 |
| ユーザB | b@example.com | 2024/10/04 | ||||
| ユーザC | c@example.com | 2024/10/05 |
- 問題点:「いいね」したユーザが1つのブログ記事のデータに対して何度も繰り返し現れています。
第一正規形
第一正規形は、データを一行で表し、各セルに1つの値のみを持たせる状態です。
第一正規形のテーブル
| ブログID | タイトル | 本文 | 作成日 | いいねユーザ名 | ユーザメールアドレス | いいねした日付 |
|---|---|---|---|---|---|---|
| 1 | タイトル1 | 本文1 | 2024/10/01 | ユーザA | a@example.com | 2024/10/01 |
| 1 | タイトル1 | 本文1 | 2024/10/01 | ユーザB | b@example.com | 2024/10/02 |
| 2 | タイトル2 | 本文2 | 2024/10/02 | ユーザC | c@example.com | 2024/10/02 |
| 3 | タイトル3 | 本文3 | 2024/10/04 | ユーザA | a@example.com | 2024/10/04 |
| 3 | タイトル3 | 本文3 | 2024/10/04 | ユーザB | b@example.com | 2024/10/04 |
| 3 | タイトル3 | 本文3 | 2024/10/04 | ユーザC | c@example.com | 2024/10/05 |
- 改善点:各セルに単一の値が含まれるようになり、データの冗長性が減少しました。
第二正規形
第二正規形は、すべての非キーが候補キーに対して完全関数従属の状態です。
ここで、候補キーに対して考えます。候補キーは、データを一意に特定できるカラム(もしくは、カラムの集合)のことです。今回のテーブルだと、単一のキーはどれも重複しているため、候補キーになれません。ペアで考えてみると、{ブログID, いいねユーザ名}が候補キーになっていることが分かります。逆にそれ以外は非キーとなります。
非キーである、タイトル、本文、作成日は、ブログのIDに対して従属であり、ユーザメールアドレスはいいねユーザ名に対して従属です。また、いいねした日付は、ブログIDといいねユーザ名が確定すれば決まる値です。よって、いいねした日付のみ、完全関数従属であり、それ以外は候補キーから値が決定できるわけではないので、分離する必要があります。
いいねテーブル
| ブログID | いいねユーザ名 | いいねした日付 |
|---|---|---|
| 1 | ユーザA | 2024/10/01 |
| 1 | ユーザB | 2024/10/02 |
| 2 | ユーザC | 2024/10/02 |
| 3 | ユーザA | 2024/10/04 |
| 3 | ユーザB | 2024/10/04 |
| 3 | ユーザC | 2024/10/05 |
ユーザテーブル
| ユーザ名 | ユーザメールアドレス |
|---|---|
| ユーザA | a@example.com |
| ユーザB | b@example.com |
| ユーザC | c@example.com |
ブログテーブル
| ブログID | タイトル | 本文 | 作成日 |
|---|---|---|---|
| 1 | タイトル1 | 本文1 | 2024/10/01 |
| 2 | タイトル2 | 本文2 | 2024/10/02 |
| 3 | タイトル3 | 本文3 | 2024/10/04 |
これで、第二正規形を満たしていると言えます。
第三正規形
第三正規形は、すべての非キーが候補キーに従属している状態のことです。
第二正規形で作成したすべてのテーブルはそのテーブルの主キー(候補キー)に従属しているため、この時点で第三正規形を満たしていると言えます。