商品と価格のtableの設計
ECなどを作る時に、注文や商品や価格を管理することになる
その際にどのようにtable設計を行うか
つまり、価格に限らず、注文時のスナップショットが必要である
要件
商品の価格は変わりうる
セールで一時的に変わったり
売れ残りなので安くしたり
不況によって値上げしたり
セールで変わる場合は、その価格変動の期間が決まっている
「現在の価格」を参照できる
履歴を保持する・rollbackできる
過去の値段の履歴が見えるようにしておきたい
「注文した時点」での商品の価格は参照できる必要がある
注文した時点では100円で、その後200円に値上がりした時に、その過去の注文に影響があっては困る
過去の注文詳細ページを見たときに、購入時の価格が表示されていないといけない
改定時のデータ更新の手間が少ない
最も簡易な実装
table:product
id ... price
table:orderline
id product_id price
productとorderlineの両方でpriceを持つ
product.priceは「現在の価格」
orderline.priceは「注文した時点の価格」
問題点
DBだけを見て、価格遷移の履歴を確認できない
orderlineの構造が複雑な場合に、複製すると複雑さが増してしまう
product側の構造に変更が入った場合に、コピーした先の構造も変更しないといけない
『WEB+DB PRESS Vol.130』.iconp.28に例があるmrsekut.icon
『WEB+DB PRESS Vol.130』.iconp.29に例があるmrsekut.icon
コレが最もスマートだという気もするが、ここまでやる必要があるのかという気もするmrsekut.icon
割引率を個別に変える場合
割引率を機関で全体的に変える場合
いくつか案が考えられる
Product側に変更があった際に、別のProductとして登録する
identityがズレるとおかしくなるのでは?
Productを参照しているものは、OrderLineだけではない
例えば、「UserがこのProductを所持している」というようなものもあるかもしれない
Productの中で変更がありうる値は別のテーブルで管理する
めっちゃおかしくなりそう
データを更新するときの手間を考える
OrderLineを新規作成する際の手間を考える