【ゼロからわかる】正規化とは何か

IT用語
はむ
はむ

この前論理設計について教えてもらったのですが、実際に作業を始めると、テーブルをどのように分割していけばいいのかわからなくなりました。

タック
タック

テーブルの分割って難しいですよね。逆に言えば分割こそが、データベース設計の肝ともいえます。今回は正規化を詳しく見ていきましょう!

 

今回の記事で身に付くこと

  • テーブルを分割する考え方がわかる
  • 効率の悪いテーブルをつくらなくなる

 

論理設計の工程のうち正規化に焦点を当ててお話します。論理設計って何?という方はこちらが参考になります。

 

正規化とは「効率の悪いテーブルを分割すること」です。大きく分けると3つの工程に分かれています。

  • 第1正規形
  • 第2正規形
  • 第3正規形

 

それでは、3つの工程をざっくり見ていきましょう。

 

スポンサーリンク

第1正規形

第1正規形とは「一つのセルには一つのデータだけ入れるテーブルにすること」です。

 

次のテーブルをみると、商品欄に複数の情報があります。エクセルでよく見られますね。

id会社名メールアドレス商品割引率
1AA@co.jpタブレット
スマホ
10
2BB@co.jp洗濯機0
3CC@co.jpパソコン10
4DD@co.jp掃除機
冷蔵庫
20
5EE@co.jpパソコン30

 

この状態を分割して解消するのが第1正規形です。

 

なぜ、一つのセルに一つの情報とするのでしょうか。その理由は主キーから関連するデータを一つに決めるためです。

 

主キーは出席番号みたいなものです。重複しない値になっているため、データの情報を一つに特定することができます。

 

主キーであるid:2に対して商品:洗濯機が一対一で対応することで、一つに絞り込むことができます。

 

一方でid:1に対して、商品の中にスマホとタブレットが入っているので、商品が特定できなくなってしまっています。

 

キーから関連するデータを一つに絞り込めない事態を避けるために、第一正規形にします。

id会社名メールアドレス商品割引率
1AA@co.jpタブレット10
2AA@co.jpスマホ10
3BB@co.jp洗濯機0
4CC@co.jpパソコン10
5DD@co.jp掃除機20
6DD@co.jp冷蔵庫20
7EE@co.jpパソコン30

 

第2正規形

第2正規形とは「完全に従属する関係にあるもの同士に分割すること」です。

 

もう少しわかりやすい表現にすると「データを仲間同士にまとめること」です。

 

ここで言う従属や仲間は何を指しているのでしょうか。「主キーと関係性のあるデータ」だと捉えるといいと思います。

 

第一正規形のテーブルを考えてみましょう。

id会社名メールアドレス商品割引率
1AA@co.jpタブレット10
2AA@co.jpスマホ10
3BB@co.jp洗濯機0
4CC@co.jpパソコン10
5DD@co.jp掃除機20
6DD@co.jp冷蔵庫20
7EE@co.jpパソコン30

よく見ると2つの関係になっていることに気付きます。会社に関する情報と商品に関する情報です。

 

それぞれの仲間同士に分割します。これが第2正規化です。

会社テーブル

会社id会社名メールアドレス
1AA@co.jp
2BB@co.jp
3CC@co.jp
4DD@co.jp
5EE@co.jp

商品テーブル

商品id商品割引率
1タブレット10
2スマホ10
3洗濯機0
4パソコン10
5掃除機20
6冷蔵庫20
7パソコン30

 

スポンサーリンク

第3正規形

第3正規形とは「隠れた関係性を分割すること」です。

 

商品テーブルを割引率に着目してみてみます。一見すると商品と割引率は商品に関する情報でひとまとめにできそうです。

 

今後割引率が50%で販売したい商品があると仮定しましょう。

 

この場合、商品データを登録しない限り、割引率50%は設定できません。商品データと割引率が同じレベルで管理されているからです。

 

割引率は割引率として別のテーブルで管理すれば、この問題は解決できます。

商品テーブル

商品id商品
1タブレット
2スマホ
3洗濯機
4パソコン
5掃除機
6冷蔵庫
7パソコン

割引率テーブル

割引率id割引率
10
210
320
430
550

分割したテーブルはSQL文で結合(JOIN)することで、必ず元の形にすることができます。

 

 

正規化は常にするべきか

第3正規形までは原則行ったほうがいいと言えます。

  • データの冗長性が排除されて、データの不整合が起きにくくなる
  • テーブルの持つ意味が明確になり、開発者が理解しやすい

 

一方でテーブル数が増えるためSQLで結合することが多くなり、パフォーマンスが低下するデメリットもあるので、意識する必要があります。

 

 

まとめ

最後にまとめていきます!

  • 第1正規形「一つのセルには一つのデータだけ入れるテーブルにすること」
  • 第2正規形「完全に従属する関係にあるもの同士に分割すること」
  • 第3正規形「隠れた関係性を分割すること」

 

第3正規形までしたテーブルはSQLで結合することで元の形にすることができる。

 

第3正規形までは原則行うほうがいいが、パフォーマンスが悪くなるデメリットもある。

 

参考

今回参考にさせていただいたのは「達人に学ぶDB設計 徹底指南書」です。

 

今回は第3正規形まで説明しました。この書籍では更に詳しく

  • ボイスーコッド正規形
  • 第4正規形
  • 第5正規形

まで説明されているので、より深く知りたいと思った方はぜひ御覧ください!

 

 

コメント

タイトルとURLをコピーしました