
スポンサーリンク
データベースは、情報を効率的に管理・検索するためのシステムであり、さまざまな用途で活用されています。特にリレーショナルデータベース(RDB)は、表形式でデータを整理し、SQL(Structured Query Language)を用いて操作するのが一般的です。本記事では非正規形~第三正規形までの正規化のやり方を具体例を用いて詳しく解説します。
正規化とは
正規化とは複数テーブルに、同一情報が重複して存在することがないように最適化
することです。データの冗長性を排除し、一貫性を保ちながら効率的にデータを管理します。正規化を適切に行うことで、データの整合性を維持し、更新時の不整合を防ぐことができます。
非正規形から第1正規形~第5正規形までの段階が存在し、データベースの重複や矛盾を取り除くことで正規化の段階が上がります。
正規化の目的
- データの重複を減らす - 余分なデータを排除し、ストレージを効率的に使用する。
- データの一貫性を保つ - 更新時の不整合を防ぐ。
- データの整合性を確保する - 論理的に意味のあるデータ構造を維持する。
- 保守性を向上させる - 変更が容易になり、拡張性が向上する。
- 検索の最適化 - クエリのパフォーマンスを向上させ、不要なデータアクセスを減少させる。
正規化のメリットとデメリット
メリット
- データの整合性の向上:正規化により、データの一貫性が維持され、エラーの発生率が低減。
- 冗長性の削減:データの重複を防ぎ、ストレージを効率的に活用。
- データ更新の容易さ:1つのデータを変更するだけで済むため、メンテナンスが容易。
- データ検索の最適化:適切に正規化されたテーブルは、検索クエリの最適化に寄与。
メリット
- クエリの複雑化:テーブルの分割により、複雑な結合(JOIN)が必要になる。
- パフォーマンスの低下:結合回数が増えることで、検索速度が遅くなる可能性がある。
- 設計の難易度が上がる:適切な正規化を行うためには、データの関係を深く理解する必要がある。
正規形の種類と具体例
正規化には、いくつかの段階(正規形)が存在し、それぞれの段階でデータの整理度が高まります。
非正規形(UNF)
正規化を行っていない状態(非正規形)では、データが適切に整理されておらず、冗長性や不整合が生じやすくなります。
例:非正規形のテーブル
注文テーブル
注文ID | 注文日 | 顧客ID | 顧客名 | 商品ID | 商品名 | 価格 | 数量 | 商品ID | 商品名 | 価格 | 数量 |
---|---|---|---|---|---|---|---|---|---|---|---|
001 | 7/1 | 001 | 田中太郎 | 001 | みかん | 100 | 3 | 002 | りんご | 150 | 2 |
002 | 7/2 | 002 | 佐藤次郎 | 002 | りんご | 150 | 10 | 003 | バナナ | 200 | 6 |
003 | 7/3 | 002 | 佐藤次郎 | 003 | バナナ | 200 | 5 | - | - | - | - |
この状態では、「商品」「数量」「価格」が複数の値を持っており、検索や更新が難しくなります。データの冗長性が高いため、修正時の手間も増加し、データの一貫性を保つのが困難になります。
UNF(Unnormalized Form)は「非正規形」の略で、データがまだ正規化されていない状態を指します。UNFでは、1つのフィールドに複数の値が含まれるなど、冗長性やデータの不整合が発生しやすくなります。正規化を進めることで、データの整合性や検索効率を向上させることができます。
第1正規形(1NF)
非正規形からテーブル行の繰り返しを取り除いた状態のことです。例では商品ID,商品名,価格,数量
の重複を分割しています。各カラムが単一の値を持ち、非正規系のように繰り返しのグループが存在しません。
例:第1正規形のテーブル
注文テーブル
注文ID | 注文日 | 顧客ID | 顧客名 | 商品ID | 商品名 | 価格 | 数量 |
---|---|---|---|---|---|---|---|
001 | 2024/7/1 | 001 | 田中太郎 | 001 | みかん | 100 | 3 |
001 | 2024/7/1 | 001 | 田中太郎 | 002 | りんご | 150 | 2 |
002 | 2024/7/2 | 002 | 佐藤次郎 | 002 | りんご | 150 | 10 |
002 | 2024/7/2 | 002 | 佐藤次郎 | 003 | バナナ | 200 | 6 |
003 | 2024/7/3 | 002 | 佐藤次郎 | 003 | バナナ | 200 | 5 |
NF(Normal Form)とは、データベースの正規形を示す略称です。データベースの正規化を行う際に、各段階(第一正規形: 1NF、第二正規形: 2NF、第三正規形: 3NF など)を指す際に使われます。各正規形は、データの整合性を高め、冗長性を削減し、管理しやすいデータ構造を構築するためのルールを定めています。
第2正規形(2NF)
第1正規形のテーブルから部分関数従属をなくした状態のことです。
部分関数従属とは、主キーが複数あるテーブルにおいて、一部のキーだけで決定できる項目のことです。
第1正規系の例では注文ID
と商品ID
でレコードが一意になる複合主キーです。
注文ID
のみで注文日,顧客ID,顧客名
を決定できて、商品ID
のみで商品名,価格
が決まるのでテーブルを分離します。
例:第2正規形のテーブル
注文テーブル
注文ID | 注文日 | 顧客ID | 顧客名 |
---|---|---|---|
001 | 2024/7/1 | 001 | 田中太郎 |
002 | 2024/7/2 | 002 | 佐藤次郎 |
003 | 2024/7/3 | 002 | 佐藤次郎 |
注文商品テーブル
注文ID | 商品ID | 数量 |
---|---|---|
001 | 001 | 3 |
001 | 002 | 2 |
002 | 002 | 10 |
002 | 003 | 6 |
003 | 003 | 5 |
商品テーブル
商品ID | 商品名 | 価格 |
---|---|---|
001 | みかん | 100 |
002 | りんご | 150 |
003 | バナナ | 200 |
第3正規形(3NF)
第2正規形のテーブルから推移的関数従属をなくした状態のことです。
推移関数従属性とは、テーブル内の一部項目が主キーでない項目によって決定されることです。
例では顧客ID
によって、顧客名
が決定されるため、別表に移します。
例:第3正規形
注文テーブル
注文ID | 発注日 | 顧客ID |
---|---|---|
001 | 2024/7/1 | 001 |
002 | 2024/7/2 | 002 |
003 | 2024/7/3 | 002 |
顧客テーブル
顧客ID | 顧客名 |
---|---|
001 | 田中太郎 |
002 | 佐藤次郎 |
注文商品テーブル
注文ID | 商品ID | 数量 |
---|---|---|
001 | 001 | 3 |
001 | 002 | 2 |
002 | 002 | 10 |
002 | 003 | 6 |
003 | 003 | 5 |
商品テーブル
商品ID | 商品名 | 価格 |
---|---|---|
001 | みかん | 100 |
002 | りんご | 150 |
003 | バナナ | 200 |
その他正規形
第三正規系以降はボイス・コッド、第四、第五正規形が存在します。
ボイス・コッド、第四、第五正規系
ボイス・コッド以降の各正規形は一般的に実施しないため、詳しい説明は省略しますが、概要は以下の通りです。
正規形 | 概要 |
---|---|
ボイス・コッド正規形(BCNF) | 3NFを満たし、すべての決定子がスーパーキーであることが必要。 主キー以外の列が他の列に依存しないようにすることで、異常を排除。 |
第四正規形(4NF) | BCNFを満たし、多値従属性を排除。 1つのキーに対して複数の独立した値が関連付けられる場合、それを分離する。 |
第五正規形(5NF) | 4NFを満たし、結合従属性を排除。 分割されたテーブルを再結合したときに、元のデータが正しく再構築できるようにする。 |
正規化はどこまで行うべきか
過剰な正規化はデータ管理効率が悪くなるため、ボイス・コッド以降は正規化をせずに第3正規形まで行うことが一般的です。
基本情報技術者試験の過去問
基本情報の過去問を解いて、理解度を深めましょう。
基本情報技術者試験ドットコムのリンクを載せておきます。
基本情報技術者平成20年秋期 午前問57
基本情報技術者平成21年春期 午前問32
基本情報技術者平成22年春期 午前問30
まとめ
- 非正規系は、テーブルの
行に重複がある状態
のこと。 - 第1正規系は、非正規形から
テーブル行の繰り返しを取り除いた状態
のこと。 - 第2正規系は、第1正規形のテーブルから
部分関数従属を除いた状態
のこと。- 部分関数従属は、主キーが複数あるテーブルにおいて、
一部のキーだけで決定できる項目
のこと。
- 部分関数従属は、主キーが複数あるテーブルにおいて、
- 第3正規系は、第2正規形のテーブルから
推移的関数従属
を除いた状態のこと。- 推移的関数従属は、テーブル内の一部の項目が、
主キーでない項目によって決定される
こと。
- 推移的関数従属は、テーブル内の一部の項目が、
- ボイス・コッドを含め、第4正規形以降の正規化は一般的には行わない。
以上で本記事の解説を終わります。
よいITライフを!