それはあなたが望む通常の形に依存します。
このようなカードテーブルを考えてみましょう。主キーは次の(Name, Set)
とおりです。
Card:
| Name | Set | Symbol |
---------------------------
| Card 1 | Set 1 | 1 |
| Card 2 | Set 1 | 1 |
| Card 3 | Set 1 | 1 |
| Card 1 | Set 2 | 2 |
| Card 2 | Set 2 | 2 |
このテーブルは第一正規形(1NF)です。ただし、の値はの値に依存し、主キーの適切なサブセットであるため、第2正規形(2NF)ではありません。Symbol
Set
(Set)
質問で述べたように、2NFが必要な場合は、別のSet
テーブルを作成する必要があります。
Card:
| Name | Set |
------------------
| Card 1 | Set 1 |
| Card 2 | Set 1 |
| Card 3 | Set 1 |
| Card 1 | Set 2 |
| Card 2 | Set 2 |
Set:
| Name | Symbol |
------------------
| Set 1 | 1 |
| Set 2 | 2 |
これらのテーブルは両方とも2NF(および3NF、BCNF、4NF、...)になりました。
質問の2番目の部分に関して、1つのテーブルにすべての列を含める代わりにこれを行う理由は2つあります。
- 変更を簡単にするため。セットの属性を変更する場合は
Set
、そのセットのすべてのカードを更新するのではなく、テーブルの1つの行を更新するだけで済みます。
- データ破損の可能性を減らすため。setとsymbolの間には実際の依存関係がありますが、最初の表はこれを強制していません。これは、同じセットのカードが異なるシンボルを持っている破損状態にデータベースが喜んで入ることを可能にすることを意味します。テーブルの2番目のセットでは、これは発生しません。