質問: ### 実現したいこと・前提 railsでmysqlをつかっています。 通販のデータベース設計をしており、 過去の注文を見れるようにしたいと考えています。 よく通販のデータベース設計の例として 買い物の注文を確定させたとき、 注文テーブルと注文明細にレコードが作成され、 注文明細テーブルには、商品の情報が必要なので、商品テーブルを参照する外部キーが入っていると説明されています。 注文テーブル(注文詳細を多数保有している親テーブル) | id | 注文日時 | 顧客(FK) | 小計 | 手数料 | 支払合計額 | | --- | --- | --- | --- | --- | --- | 注文詳細テーブル(一つの注文に従う子テーブル) | id | 注文id(FK) | 商品id(FK) | 購入数量 | 単価 | | --- | --- | --- | --- | --- | 商品テーブル(多数の注文詳細から参照される親テーブル) | id | 商品名 | 商品説明 | 価格 | | --- | --- | --- | --- | ### 疑問点 ここでふと疑問に思ったのですが、 商品の更新(例えば、価格や説明文とかが変更)されたり、 販売中止とかで削除されてしまうと困ったことになるのではないかと。 例えば、 外部キー制約(RESTRICT)で、親テーブル(商品)の変更・削除を許さない場合は、 商品情報を更新できなくて困るかと思います。 かといって外部キー制約CASCADEにすると新しく更新された商品情報が子テーブルである注文詳細にも反映されてしまうため、購入した当時の商品情報を見ることができなくなってしまいます。 外部キー制約SET NULLにした場合も、購入当時の商品情報が見れなくなります。(また、頻繁に商品が更新されるのならば、注文明細の外部キーカラムがnullだらけで参照する意味が薄くなるのではないか?) この場合、 購入当時のアイテム情報を見れるようにするにはどのテーブルに保存すればいいのでしょうか? (新しいテーブルをつくるのか、または注文詳細テーブルに商品名、商品説明などをカラムを新たにつくって記録すればいいのでしょうか?) 教えて頂ければ幸いです。
回答: カラムにその商品情報の開始時期・終了時期を作成する。 登録時にUPDATEをかけるのではなくINSERTをする。 時期によって表示を変えるプログラムを書く。 これらで出来ると思います。 回答になっていますか?