商品と価格のtableの設計
ECなどを作る時に、 注文
や 商品
や 価格
を管理することになる
その際にどのようにtable設計を行うか
つまり、 価格
に限らず、 注文
時のスナップショットが必要である
要件
商品
の価格は変わりうる
セールで一時的に変わったり
売れ残りなので安くしたり
不況によって値上げしたり
セールで変わる場合は、その価格変動の期間が決まっている
「現在の価格」を参照できる
履歴を保持する・rollbackできる
過去の値段の履歴が見えるようにしておきたい
「 注文
した時点」での商品の 価格
は参照できる必要がある
注文
した時点では100円で、その後200円に値上がりした時に、その過去の 注文
に影響があっては困る
過去の注文詳細ページを見たときに、購入時の価格が表示されていないといけない
改定時のデータ更新の手間が少ない
最も簡易な実装
product
と orderline
の両方で price
を持つ
product.price
は「現在の価格」
orderline.price
は「注文した時点の価格」
問題点
DBだけを見て、価格遷移の履歴を確認できない
orderline
の構造が複雑な場合に、複製すると複雑さが増してしまう
product
側の構造に変更が入った場合に、コピーした先の構造も変更しないといけない

p.28に例がある


p.29に例がある

コレが最もスマートだという気もするが、ここまでやる必要があるのかという気もする

割引率を個別に変える場合
割引率を機関で全体的に変える場合
いくつか案が考えられる
Product側に変更があった際に、別のProductとして登録する
identityがズレるとおかしくなるのでは?
Productを参照しているものは、OrderLineだけではない
例えば、「UserがこのProductを所持している」というようなものもあるかもしれない
Productの中で変更がありうる値は別のテーブルで管理する
めっちゃおかしくなりそう
データを更新するときの手間を考える
OrderLineを新規作成する際の手間を考える