題外話#
この種の問題は、候補キーの組み合わせの判断方法に伴うことが一般的ですので、本記事では、まず范式を区別する方法を紹介する前に、候補キーを特定する方法を紹介します。
候補キーの求法:依存集に基づいて、右側に一度も現れたことのない属性を見つけると、それは必ず候補キーの一つです。その属性を基に、依存集に従って順次拡張し、すべての属性を遍歴できるかどうかを確認し、遍歴できないものを候補キーに追加します。
次に、范式を区別する方法について議論を続けます。
関連概念及びケース解析#
1NF: 列の原子性を強調します。つまり、列は他のいくつかの列に分割できません。
例えば:下の図では、図書は図書番号と書名に分解でき、この時は1NFには該当しません。2NF: 1. 第一范式を満たすこと 2. 各非主属性は候補キーまたは主キー(主コード)に完全に関数依存している必要があります。
PS:複合フィールドが主キーの場合にのみ、2NFを満たさない状況が発生する可能性があります。
例えば:
下の図では、前述の方法に基づいて、この関係モデルの候補キーがEMであることを判断でき、関数依存集にはM→Lが存在し、EMから直接導出されるものではないため、部分的な関数依存が存在し、2NFには該当しません。3NF: 1. まず第二范式を満たすこと 2. 非主属性間に関数依存が存在しない(または伝播依存が存在しない)。
つまり、この時主属性はAで、A→B、A→Dがあり、この時B→Cのような状況は発生してはいけません。BCNF: 1. 前のすべての低級范式の要件を満たすこと 2. 主コード(主キー)間に依存が存在しない。
例えば:
まとめ#
すべてのリレーショナルデータベースのテーブルは、第一范式を満たしています。第一范式は、本質的にリレーショナルデータベースに対する制約です。
第二、第三范式は、データベーステーブルの合理的な設計に対する要求が多く、第二、第三范式を理解することで、データベーステーブルの設計をより良く支援できます。