質問の内容
Q. 商品の購入という出来事を表現するため、下図のようにデータベースを設計したとします。このとき、購入テーブルのほうが「合計金額(税抜)」をカラムとして保持すべきでしょうか、それとも購入商品テーブルのほうが「購入時の単価」をカラムとして保持すべきでしょうか。
なお、以下のような前提があるものとします。
- ユーザによって商品の購入が行われると、その時点における商品テーブルのデータに基づき、購入テーブルと購入商品テーブルにデータが作成される。購入時の手数料や割引などは、金額調整テーブルのデータとして作成される(例 名目:手数料 金額:150)。
- 購入テーブルと購入商品テーブルと金額調整テーブルはトランザクションデータテーブルであり、一度保存されたデータは、更新も削除もされない。
- ユーザテーブルと商品テーブルはマスタであり、メンテナンスなどの過程で各データは更新されうる。また、論理削除されうるが、物理削除はされない。
質問の意図
ネット上で正規化手法の記事を読んでいると、ほとんどの場合が「合計金額(税抜)」を残し、「購入時の単価」(または小計)のカラムを削除しています。
- https://proengineer.internous.co.jp/content/columnfeature/6480#section302
- https://rfs.jp/sb/sql/s01/05-13.html#2
- https://high-programmer.com/2017/10/21/db-normalization-difference/
個人的意見としては、「各商品の単価から合計金額を導出することはできるが、合計金額から各商品の単価を導出することはできない」と思うので、データベース設計の際には「合計金額(税抜)」よりも「購入時の単価」のほうを残しておいたほうが、後からそのデータがほしくなったときに都合がよいと感じます。
おそらく、ネット記事の例では「合計金額は各商品の単価×数量の和と一致しないケースがある」ということに配慮し、安全のために「合計金額(税抜)」のほうを残しているのだろうとは思うのですが、もとの非正規形のテーブルでは記録できていたはずの「購入時の単価」(または小計)のカラムを、正規化の過程で削除してしまうのは、情報無損失分解の原理に反しているようにも見えます。
このような操作は正規化のポリシーとして正しいのかどうか気になり、質問いたしました。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/29 05:57