※ 本記事では、基本情報技術者試験の対策として私が勉強したことを備忘録的にまとめておきたいと思います。
少しでも参考になれば嬉しいです。
はじめに
さて今回は、基本情報技術者試験対策として、正規化についてまとめたいと思います。
データの冗長性を排除し、整合性を保つためのプロセス・・・まぁ要はデータを扱いやすいように、良い感じに整えるプロセス程度に思ってもらえればと。
実際にこれを正規化しましょう、みたいな問題はよく問われるので必ずできるようにしましょう!超必須級の知識になります~。
ちなみに私はこの参考書を使って勉強してました。
漫画形式で読みやすく、分かりやすい内容になっているため、無理なく学習を進められると思います。
過去問を解きまくり、不明点があれば参考書で知識を補う、このサイクルで試験対策するのが私のオススメです!
最新版はこちらです。
少し内容が異なる部分もあるかもしれませんが、大まかには変わらないはずですので、安心して下さい。
正規化とは?
正規化(Normalization)とは、データベースの設計において、データの冗長性を排除し、データの整合性を保つためのプロセスです。目的は、データが効率的に管理され、データの重複や矛盾が生じないようにすることです。正規化によって、データベースは階層的に整理され、データの更新や削除、挿入が容易になります。
正規化には大きく3つのステップがあります。それぞれとても重要なのでしっかりと理解しておきましょう。
第1正規形(1NF)
データベース設計における正規化の第1段階である第1正規形(1NF)は、繰り返しを避けるようなイメージです。ポイントは以下の通り。
- すべての列が単一の値を持つ:
各フィールドには複数の値を格納せず、1つの値のみを含めます。たとえば、顧客テーブルにおいて、電話番号が複数ある場合でも、1つのセルに複数の番号を格納するのではなく、別の行や列で管理する必要があります。
- 重複する列がない:
テーブル内の列が重複しないように設計します。同じ意味を持つ列が複数存在してはならず、冗長な情報は避けるべきです。
- 順序に依存しない:
テーブルの行や列の順序が意味を持たないことが条件です。データの並び順によって意味が変わらないように設計します。
テーブルが第1正規形を満たしていない場合、以下の手順で1NFに変換します。
- ステップ1: 繰り返し要素の削除
繰り返しのデータ(複数の値が1つのフィールドに存在する場合)を別のテーブルに分割します。たとえば、顧客が複数の電話番号を持つ場合、電話番号専用のテーブルを作成し、それを顧客テーブルとリレーションします。
- ステップ2: 列の分割
各列に1つの属性のみが含まれるように列を分割します。たとえば、「住所」という列に「市区町村」や「郵便番号」などが含まれている場合、それぞれを別の列に分けます。
- ステップ3: 主キーの設定
各行を一意に識別するための主キーを設定します。これにより、データの重複や不整合が防止されます。
例えばこんな感じの表があった時、「顧客ID:A001」の中に、「B001」と「B002」の注文がありますよね?要は重複があるような状態となっています。
顧客ID | 注文ID | 注文日 | 顧客名 | 顧客情報 | 注文ID | 注文日 | 顧客名 | 顧客情報 |
---|---|---|---|---|---|---|---|---|
A001 | B001 | 10/6 | 田中 | 東京 | B002 | 10/10 | 田中 | 東京 |
A002 | B003 | 11/9 | 佐藤 | 京都 | – | – | – | – |
こちらを、第1正規形(1NF)の形となるよう整理しましょう。
顧客ID | 注文ID | 注文日 | 顧客名 | 顧客情報 |
---|---|---|---|---|
A001 | B001 | 10/6 | 田中 | 東京 |
A001 | B002 | 10/10 | 田中 | 東京 |
A002 | B003 | 11/9 | 佐藤 | 京都 |
黄色ハイライトを付けた箇所が新しく入れ込んだ箇所になります。
「顧客ID:A001」の中に、「B001」と「B002」の注文があった状態を分割(繰り返しを削除)し、それぞれ顧客IDに紐づけてレコードとして挿入しています。これで、顧客IDに紐づいた綺麗な表組になりましたね。
第2正規形(2NF)
続いて第2正規形(2NF)の形にしましょう。
ただその前に、「関数従属」と「部分関数従属」というワードをしっかりと理解しておきましょう。
関数従属
関数従属(Functional Dependency)とは、データベース理論において、ある属性(列)の値が他の属性(列)の値に一意に決定される関係を表します。簡単に言えば、ある列の値が決まれば、それに従って他の列の値も一意に決まる、という関係を指します。
例題を交えて分かりやすくしましょうか。以下のような表があったとします。
社員ID | 名前 | 部署 |
---|---|---|
001 | 佐藤 | 営業部 |
002 | 鈴木 | 経理部 |
003 | 田中 | 営業部 |
こちらは、「社員ID」が分かれば、「名前」や「部署」が分かるという関係になっていると思います。このような関係を関数従属と言います。
部分関数従属
部分関数従属(Partial Functional Dependency)とは、データベースの複合キーにおいて、そのキーの一部の属性だけで他の属性の値が決定されてしまう関係を指します。
こちらも例を見ていきましょう。
注文ID | 商品ID | 顧客名 | 商品名 | 価格 |
---|---|---|---|---|
001 | A001 | 佐藤 | パソコン | 100,000 |
001 | A002 | 佐藤 | マウス | 3,000 |
002 | A001 | 高橋 | パソコン | 100,000 |
例えばこのような表だと、「注文ID」と「商品ID」の複合キーで1レコードを特定させるようなイメージです。それぞれ一方だけだと、レコードを特定することはできません。「注文ID」が分かれば「顧客名」が分かりますし、「商品ID」が分かれば「商品名」や「価格」が分かるといったような状況です。このような関係性を、「部分関数従属」と呼びます。
はい、とまぁこんな感じで「関数従属」、「部分関数従属」がどんなもんかは分かったかと思います。
これが分かれば第2正規形(2NF)は余裕で理解できます。
第2正規形 (2NF) は、データの部分関数従属を排除し、データの冗長性を最小化することです。ちなみに第1正規形(1NF)の状態を作り出していないと第2正規形(2NF)にはできませんので要注意です。
例を見ましょう。
顧客ID | 注文ID | 注文日 | 顧客名 | 顧客情報 |
---|---|---|---|---|
A001 | B001 | 10/6 | 田中 | 東京 |
A001 | B002 | 10/10 | 田中 | 東京 |
A002 | B003 | 11/9 | 佐藤 | 京都 |
このテーブルでは、「顧客ID」と「注文ID」の2つが複合キーになっています。しかし、「顧客名」と「顧客住所」は主キー全体に依存しているわけではなく、「顧客ID」のみに依存しています。このような部分関数従属は、第2正規形の要件を満たしていませんのでこちらを以下のように分割します。
顧客ID | 顧客名 | 顧客住所 |
---|---|---|
A001 | 田中 | 東京 |
A002 | 佐藤 | 京都 |
注文ID | 顧客ID | 注文日 |
---|---|---|
B001 | A001 | 10/6 |
B002 | A001 | 10/10 |
B003 | A002 | 11/9 |
このように、顧客の情報を別のリレーションに切り出すことで、各テーブルは完全に主キーに依存する形となり、第2正規形を満たすことになります。
第3正規形(3NF)
第3正規形(3NF)は、推移的関数従属を排除する正規化の形です。これは、第1正規形(1NF)および第2正規形(2NF)を満たした状態で、さらにデータの整合性を強化するために行われます。
推移的関数従属とは、キーでない項目が、別の項目に依存する関係のことです。この辺り含めて例から理解していきましょう。
例えば、第2正規形(2NF)まで綺麗に正規化された以下のような表があったとします。
社員ID | 社員名 | 部署ID | 部署名 | 部署所在地 |
---|---|---|---|---|
001 | 佐藤 | B001 | 営業部 | 東京 |
002 | 鈴木 | B002 | 経理部 | 京都 |
003 | 田中 | B001 | 営業部 | 東京 |
主キーは「社員ID」ですね。これが分かればレコードが確定します。もちろん部分関数従属の関係もありません。
ただ、この中で、キーではない、「部署ID」により「部署名」や「部署所在地」が特定されると分かりませんか?このように、キーではない項目がにより、別の項目が特定されるような関係が、推移的関数従属といった関係ですね。これが削除された形が、「第3正規形(3NF)」です。以下のようになるはずですね。
社員ID | 社員名 | 部署ID |
---|---|---|
001 | 佐藤 | B001 |
002 | 鈴木 | B002 |
003 | 田中 | B001 |
部署ID | 部署名 | 部署所在地 |
---|---|---|
B001 | 営業部 | 東京 |
B002 | 経理部 | 京都 |
B001 | 営業部 | 東京 |
とまぁこんな感じですね。
最後に
さて今回は、基本情報技術者試験対策として、正規化についてまとめました。
それぞれどのようなステップを踏んで、何をやっているのか理解するのがとても重要です。
また、それぞれに付随した「関数従属」「部分関数従属」等のワードもとても重要です。合わせて覚えておくようにしましょう。
簡単にポイントもまとめておきましょう。
★第1正規形(1NF)
表の繰り返しを削除
★第2正規形(2NF)
表の部分関数従属を削除
★第3正規形(3NF)
表の推移的関数従属を削除
前回まとめた記事も読んでもらえると嬉しいです!
基本情報以外の勉強記事も是非!
オススメ参考書 & Udemy講座
過去問編
兎にも角にも過去問を解かないことには始まりません。解いて解いて解きまくりましょう!
特に以下の参考書は問題数が多いのでオススメです。
この1冊だけ買って、とりあえず1周すれば合格がかなり近くなると思います!
科目A+B両方合わせて4セット収録されてるとかヤバすぎます・・・
知識網羅編
以下は知識網羅編として、講義系の参考書、動画をピックアップしています。
1からしっかりと学習し、知識を身に着けたい方はとてもオススメです。
過去問を解きまくり、不明点を参考書で補う。これが最高の勉強サイクルです~
私が勉強する際に使用していたオススメ参考書は以下です。
上記シリーズの最新版は以下です。(内容はそこまで変わらないはずですが・・・)
私がぜひオススメしたい、Udemyの講座もいくつかピックアップしておきます。
誰かに解説してもらった方が分かりやすい場合もありますからね~
画像でもボタンでも、どちらを押下しても講座へ飛べるようにしてありますので是非!
コメント