generated at
商品と価格のtableの設計
ECなどを作る時に、 注文 商品 価格 を管理することになる
その際にどのようにtable設計を行うか
つまり、 価格 に限らず、 注文 時のスナップショットが必要である


要件
商品 の価格は変わりうる
セールで一時的に変わったり
売れ残りなので安くしたり
不況によって値上げしたり
消費税率が変わったり
セールで変わる場合は、その価格変動の期間が決まっている
「現在の価格」を参照できる
履歴を保持する・rollbackできる
過去の値段の履歴が見えるようにしておきたい
注文 した時点」での商品の 価格 は参照できる必要がある
注文 した時点では100円で、その後200円に値上がりした時に、その過去の 注文 に影響があっては困る
過去の注文詳細ページを見たときに、購入時の価格が表示されていないといけない
改定時のデータ更新の手間が少ない


最も簡易な実装
product
id...price
orderline
idproduct_idprice
product orderline の両方で price を持つ
product.price は「現在の価格」
orderline.price は「注文した時点の価格」
問題点
DBだけを見て、価格遷移の履歴を確認できない
orderline の構造が複雑な場合に、複製すると複雑さが増してしまう
product 側の構造に変更が入った場合に、コピーした先の構造も変更しないといけない
そもそも商品と価格のtableの設計#6344247b1982700000d4d7d8をあまり満たしていない



『WEB+DB PRESS Vol.130』p.28に例があるmrsekut


『WEB+DB PRESS Vol.130』p.29に例があるmrsekut
コレが最もスマートだという気もするが、ここまでやる必要があるのかという気もするmrsekut



>




割引率を個別に変える場合
割引率を機関で全体的に変える場合


いくつか案が考えられる
Product側に変更があった際に、別のProductとして登録する
identityがズレるとおかしくなるのでは?
Productを参照しているものは、OrderLineだけではない
例えば、「UserがこのProductを所持している」というようなものもあるかもしれない
Productの中で変更がありうる値は別のテーブルで管理する
めっちゃおかしくなりそう


データを更新するときの手間を考える


OrderLineを新規作成する際の手間を考える