【テーブル】正規化によるテーブル分割方法

テーブル

Accessも含めた「リレーショナルデータベース(RDB)」の大きな特徴は、データを複数のテーブルに分割し、効率的に管理できる点にあります。この効率的なデータ管理を実現するために不可欠な概念が「正規化」です。

本記事では、テーブル設計における正規化の必要性に焦点を当て、具体的な正規化の手順を解説します。

正規化の概要

データベースの正規化を一言で表現すると「データの整理整頓術」です。データをテーブルという「きちんと整理されたいくつかの箱」に分けて格納し、重複をなくし、矛盾を防ぎます。

例えば、顧客と注文の情報を管理するテーブルがあったとします。これらを1つのテーブルで管理すると、注文ごとに顧客情報を何度も入力する必要があります。何度も入力するので時には誤入力があったり、そもそも記憶容量を無駄に消費していまいます。これが重複の無駄であり、矛盾です。

このような重複の無駄や矛盾を解消する手法が正規化です。

正規化の手順

正規化には第1正規形から第5正規形までの段階がありますが、一般的には第3正規形までを適用します。今回は下記の「社員資格管理テーブル」を題材に、具体的な正規化を進めていきましょう。

上表は、ある会社の社員が保持している資格を一覧にしたものです。このテーブルには、一目でわかる問題点がいくつかあります。最も大きな問題点は、資格名と資格取得日のフィールドに、複数の資格情報がカンマ区切りで入力されていることです。

この形式でデータを管理すると、以下のようなデメリットが生じます。

・視認性が悪い
・資格名を条件とした集計やカウントが困難
・資格名と取得日の関連性が不明確


Accessのテーブルでは、1レコードで1つのデータを管理するのが基本です。そのため、1つのフィールドに複数のデータを繰り返し入力する形式は避ける必要があります。そこで、第1正規形ではこれらの問題点を解消します。

第1正規形

第一正規形の目的:
同一フィールドの繰り返しデータを無くす

第1正規形では、1つのフィールド内に繰り返し入力されたデータを、1レコードにつき1データとなるよう分割します。今回の例では、社員IDが1002と1005のレコードが分割対象となります。

分割後のテーブルがこちらです。

分割したことで行が増えましたね。社員と資格の組み合わせを1レコードで管理する形式に変更し、第1正規形が完了しました。

オレンジ色が主キーです。この時点では「社員ID」と「資格名」を複合主キーとして一意のデータを特定します

第2正規形

第2正規形の目的:
主キーの一部によって決まるフィールドを別テーブルに分離する

第1正規形後のテーブルは、確かに1レコードずつ整理され見やすくなりました。しかし、データを入力する側から見ると、同じ社員IDや社員名を何度も入力する必要があり、手間がかかり、誤入力も発生しやすいという課題が残ります。この辺りの課題を解消するために、第2正規形ではテーブルの分割を行います。

併せて、現在の主キーは「社員ID」と「資格名」の複合キーですが、「資格名」は長い文字列で誤入力のリスクもあり主キーに向かないため、新規フィールドとして「資格CD」を用意して、主キーを「社員ID」と「資格CD」の組み合わせにします。

第2正規形では、主キー(「社員ID」と「資格CD」の複合キー)の一部に依存するフィールドを別のテーブルに分割します。

”主キーの一部で依存する”ってどういう意味?

今回のテーブルでいえば以下の依存関係があるよね

  • 「社員ID」が決まれば「社員名」「生年月日」「年齢」「部署名」が決定される
  • 「社員ID」と「資格CDが決まれば「資格取得日」が決定される
  • 「資格CD」が決まれば「資格名」が決定される

なるほど!赤書は全て主キーで、そのキーに依存するものを別テーブルに分割ってわけかぁ

さて、これらのテーブル分割をした結果をみてみましょう。

テーブルを3つに分割したことで、各テーブルは主キーによって一意に管理されるようになりました。

第3正規形

第3正規形の目的:
主キー以外で決まるフィールドを他テーブルに分割する
導出フィールドを削除する

第2正規形によって主キーに関連するフィールドを別テーブルに分割し、ある程度の冗長性を排除できました。しかし、「社員管理テーブル」には、まだ繰り返し入力が必要なフィールドが残っています。それは「部署名」です。主キーに直接関連しないフィールドの分割は、第3正規形で行います。

また、「年齢」フィールドは生年月日から計算で求められるため、削除対象となります。このように計算で求められるフィールドを「導出フィールド」と呼び、第3正規形ではこれらのフィールドも削除します。

さあ、これらのテーブルを分割した結果をみてみましょう。

新たに「部署CD」を設け、部署名をマスタテーブル化したことで、テーブルを適切に分割できました。

さて、正規化により元は一つのテーブルを、4つのテーブルに分割しました。

  • 社員管理テーブル
  • 資格取得管理テーブル
  • 資格マスタテーブル
  • 組織マスタテーブル

各テーブルは主キーによって一意に管理されるようになり、データの視認性が向上するとともに、手入力が不要になったことで、データ管理の効率性と信頼性も向上しました。

以上が、一般的な正規化の流れとなります。

正規化のメリットとデメリット

ひと通り手順が把握できたところで、改めて、正規化のメリットとデメリットを整理しましょう。

正規化のメリット

正規化のメリットを3点ピックアップします。

  • データの重複を無くす
  • データの整合性を保つ
  • メンテナンスを容易にする

データの重複を無くす

複数のレコードに渡り同じデータを繰り返す入力すると、記憶領域を無駄に消費するだけでなく、誤入力によりデータの矛盾が発生する原因になります。正規化によってデータを整理し、重複を排除することで、データベースを効率的に運用できます。

専門用語で「データの冗長性を排除する」という表現をよく使うよ

データの整合性を保つ

データの追加、更新、削除を行う際に、正規化されたデータベースは矛盾が生じにくく、正確なデータを維持しやすいため、データベースの信頼性を高めることができます。

メンテナンスを容易にする

適切に分割されているテーブルは視認性に優れているため、データベースの変更や修正が容易になります。これにより、メンテナンス作業の負担を軽減し、システム全体の運用効率を向上させることができます。

正規化のデメリット

正規化は、データの整合性や効率性を高める上で非常に有効な手段ですが、細かくテーブルを分割しすぎると、データベース全体の構造が複雑化することで全体のパフォーマンスや検索速度にも影響を与えます。また引継ぎを受けた後任者等がデータの関係性を理解するのが難しくなるという一面もあるでしょう。

よって、正規化を行う際には、メリットとデメリットのバランスを慎重に検討しながら、システムの規模や目的に合わせ、適切に設計を行う必要があります。

リレーションシップ

分割したテーブル同士を関連付け、一つのテーブルのように扱うことを「リレーションシップ」といいます。

こちらは実際に各テーブルをリレーションシップ機能で関連付けした様子です。

リレーションシップの関連付け

そして、こちらがクエリでデータ表示したものです。

複数テーブルを接続したクエリをデータ表示

本記事の冒頭で示したサンプルテーブルと同様(部署IDと資格CDは増えていますが)のデータとなっていますが、複数回登場するデータ(社員名の「木村」や「中村」など)は、実データではなく、別テーブルから引用している形です。よって記憶領域を消耗していませんし、手入力ではないため効率性・信頼性も高くなりました

リレーションシップについては、こちら↓の記事で詳しく解説していますので、ぜひご覧ください。

まとめ

テーブル設計において避けて通れない正規化について解説しました。最初は少し難しく感じるかもしれませんが、一度理解してしまえば、自然と正規化の考え方を取り入れたテーブル設計ができるようになるでしょう。

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