一部だけ直すと、同じ事実が食い違う
注文表のO101とO103の両方に、C01の現在の連絡先を書いたとします。一方だけ変更すると、同じ顧客の現在の連絡先が二通りになります。
これは更新時の不整合の例です。ここでいう現在の連絡先は、注文時点の配送先の履歴とは区別します。
| 起こり得る問題 | 注文に顧客情報を重複させた例 | 分離する目的 |
|---|---|---|
| 更新の不整合 | C01の連絡先を一行だけ直した | 現在の顧客情報を一か所で管理 |
| 挿入の問題 | 注文なしでは顧客を登録しにくい | 顧客を独立に登録 |
| 削除の問題 | 最後の注文と顧客情報を一緒に失う | 別の事実を巻き込まない |
注文がなくても、顧客を登録できる形へ
顧客情報を注文行だけに持つ設計では、まだ注文していない顧客を登録しにくくなります。また最後の注文を削除したとき、残したい顧客情報まで失うことがあります。
顧客表と注文表に分けると、それぞれの事実を独立に管理できます。削除の可否や保持期間は別途設計する必要があります。
何が何に依存するかで、分け方を決める
現在の顧客名・連絡先は顧客IDで決まり、注文の数量は注文IDで決まります。この違いに沿って表を分け、顧客IDで関連づけます。
単に列を半分に分ければ正規化になるわけではありません。注文時の価格や配送先を履歴として残す場合は、その時点の事実として保存する意味があります。
重複をすべて消すことだけを目的にしません。