第2正規形(2NF)とは?部分関数従属の排除を具体例で解説
第2正規形(2NF)とは?
データベース正規化における第2段階が「第2正規形(2NF:Second Normal Form)」です。
あるテーブルが2NFと呼ばれるためには、以下の条件をすべて満たす必要があります。
- リレーションが第1正規形(1NF)のルールをすべて満たしていること
- すべての非キー属性が主キーに対して完全関数従属していること
つまり、第2正規形は主キーへの部分関数従属を排除するための正規形です。
ここからは、具体的な例を使って2NFについて詳しく見ていきましょう。
例:2NFに違反するテーブル
<StudentProject>
| StudentID | ProjectID | StudentName | ProjectName |
| S89 | P09 | Olivia | Geo Location |
| S76 | P07 | Jacob | Cluster Exploration |
| S56 | P03 | Ava | IoT Devices |
| S92 | P05 | Alexandra | Cloud Deployment |
上記のテーブルには部分関数従属が存在します。どのような問題があるのか、順を追って確認してみましょう。
部分関数従属のポイント
このテーブルのキー属性(プライム属性)は StudentID と ProjectID の複合主キーです。
前述のとおり、非キー属性(非プライム属性)である StudentName と ProjectName が候補キーの一部だけに従属している場合、その関係は「部分関数従属」とみなされます。
- StudentName は StudentID だけで決定できる → 部分関数従属が発生
- ProjectName は ProjectID だけで決定できる → 部分関数従属が発生
したがって、<StudentProject> リレーションは正規化における2NFに違反しており、不良なデータベース設計と判断されます。このままではデータの重複や更新時の不整合といった問題が起こりやすくなります。
例:2NFへ変換したテーブル
部分関数従属による2NF違反を解消するには、元のテーブルを複数のテーブルに分解(デコンポーズ)します。
<StudentInfo>
| StudentID | ProjectID | StudentName |
| S89 | P09 | Olivia |
| S76 | P07 | Jacob |
| S56 | P03 | Ava |
| S92 | P05 | Alexandra |
<ProjectInfo>
| ProjectID | ProjectName |
| P09 | Geo Location |
| P07 | Cluster Exploration |
| P03 | IoT Devices |
| P05 | Cloud Deployment |
このようにテーブルを分割することで、各非キー属性が主キー全体に完全に依存する形になりました。これでリレーションはデータベース正規化における第2正規形(2NF)を満たしています。
-
第3正規形(3NF)とは?条件と変換例をわかりやすく解説
第3正規形(3NF)とは?データベースの正規化における第三段階が第3正規形(3NF:Third Normal Form)です。テーブルが3NFであるためには、次の2つの条件を満たす必要があります。リレーションが第2正規形(2NF)であること推移的関数従属が存在しないこと推移的関数従属とは、「A → B」「B → C」という依存関係から、間接的に「A → C」が導かれてしまう状態を指します。このような依存関係が残っていると、データの冗長性や更新時の不整合が発生しやすくなります。例:3NFに違反するテーブル次の <MovieListing> テーブルを見てみましょう。Movie_IDL
-
Djangoフォームウィジェットの使い方を徹底解説|Textareaで入力フォームをカスタマイズ
Djangoのフォームウィジェットとは? この記事では、Djangoフォームにおける「ウィジェット(widget)」の使い方について詳しく解説します。ウィジェットを活用すると、フロントエンドの見た目や操作性を大きく向上させることができます。 ウィジェットとは、DjangoフォームからHTMLとしてレンダリングされる要素のことです。テキストボックス(input)、テキストエリア(textarea)、パスワード入力欄(password input)など、フォームを構成するUI部品はすべてウィジェットに該当します。 事前準備:プロジェクトとアプリの作成 まずはDjangoプロジェクトとアプリを作成