質問に答えるために、しかしあなたの説明ではなく、はい、あなたはプロセスの2NFで止まることなく1NFから3NFに正規化することができます。
よくある誤解は、1NFの関係から始めることができるというものです。
- それらを2NF以上に正規化してから
- それらを3NF以上に正規化してから
- それらをBCNFに正規化し、それ以上にしないでください。
それは一般的ですが、それでも誤解です。この誤解の反例は多くの教科書で見ることができますが、それらの例を注意深く見る必要があります。私の知る限り、この誤解を明確に特定している教科書はありませんが、その例を研究すれば明らかになります。
実際には、1つのステップで1NFまたは2NFから5NFまたは6NFに移行するのが一般的です。たとえば、2NFから5NFに移行するということは、推移的な依存関係を削除することを意味します。
- 左側が候補キー(BCNFに必要)ではない依存関係が残っていないことがわかります。
- 残りの多値従属性(4NFに必要)が見つからず、
- 残りの結合依存関係は見つかりません(5NFに必要)。
これは、StackOverflowの例でよく発生します。(2NFから5NFまたは6NF、つまり。)
使用した表記法で表現された宿題の問題では、開始関係が1NFであると想定することが期待されます。あなたの最初の仕事は鍵を特定することです。なんで?部分キーの依存関係を識別できない限り、2NFに正規化することはできず、すべての候補キーを知らない限り、それを行うことはできません。
キーをAEFおよびAFHとして識別するのは正しいです。依存関係の1つがA->Dであるため、関係Rは2NFにありません。DはAのみに依存し、Aは候補キーの一部です。2NFに正規化するには、すべての部分キーの依存関係を特定し、それらを射影によって削除します。
これから始めましょう。
部分キーの依存関係A->Dを削除します。
- R 1(ABCEFH)、キー{ AEF、AFH }
- R 2(A D)
R2は6NFです。
その部分キーの依存関係をRから削除すると、R1になります。R 1には属性Dが含まれていないため、関数従属性DF->BCはR1には適用されません。ただし、DF->BCは設計全体に適用されます。これがあなたを混乱させたポイントです。
ほとんどの場合、機能依存性は単純なキー制約になります。それが、FDA->DがR2になったときに起こったことです。ただし、射影はDF-> BCの左側を分割するため、その依存関係はデータベースの制約として別の方法で表現する必要があります。(SQLはそれが得意ではありません。CREATEASSERTIONはそれらのベースをカバーすることになっていますが、まだ誰もそれを実装していません。)