テーブル設計に必要な正規化~第4、第5正規形~
第4正規形
第4正規形では候補キーではない列への多値従属性をもった列があってはならないという決まりがあります。
言葉では難しいので、例をあげます。
| 診療科 | 医師 | 診療曜日 |
| 皮膚科 | 石田先生 | 火曜日 |
| 皮膚科 | 石田先生 | 火曜日 |
| 皮膚科 | 内海先生 | 水曜日 |
| 皮膚科 | 内海先生 | 水曜日 |
このテーブルを見ると、『皮膚科は火曜日、水曜日の診療を行っている』という情報と、
『皮膚科には石田先生と内海先生が診療をしている』という2つの情報が得られます。
まとめると、『皮膚科』というキーに対して『石田先生、内海先生』、『火曜日、水曜日』という2つの情報が従属している状態になります。
また、『石田先生、内海先生』と『火曜日、水曜日』はそれぞれ独立したデータ内容で、その内容に関連性がないといえます。
このときに第4正規形にすることができます。
これを第4正規形であらわすと、
という状態になります。
元のデータを取得するために、この2つのテーブルを直積(Corss Join)することで取得できる状態のことです。
第5正規形
第5正規形は、ほぼ第4正規形と等価です。
それは第4正規形が第5正規形の条件を満たさないケースは、稀でありほとんどないためです。
第4正規形が第5正規形の条件を満たさない稀なケースとは、
第4正規形のリレーションの属性値の組み合わせを正当にするための複雑な現実世界の制約が、そのリレーションでは強制できない場合となります。
これは第4正規形で使用した例です。
これに診療時間が午前、午後とありすべての医師が全時間対応可能だという事がいえたとします。
すると第5正規形では以下のテーブルが追加されます。
この3つのテーブルの直積(Cross Join)で、目的のデータが取れる状態が第5正規形です。
しかし、現実世界で、2人の医師が同じ時間に同じ診療をするよりも、時間を変えて病院として診療可能な時間帯を増やすことが多いので、
現実世界の制約を受けて、第5正規形を使用しないことが多いです。