【发布时间】:2018-01-29 03:08:21
【问题描述】:
我使用 Ruby on Rails 框架构建了几个 Web 应用程序,并注意到一个常见的设计问题:由于某些数据的可变性,我经常需要存储一个记录的副本,其中包含发生在一定的时间。
例如,考虑具有products 和orders 表的商店应用程序。当用户放置Order 时,应用程序应在订单中存储Product 记录的副本,以便保留这些产品在订购时的状态。这样,将来对 Product 的修改不会影响过去的订单。
我通常通过引入另一个表(例如 order_products)来存储与订单关联的产品来解决此问题。每个OrderProduct 然后belongs_to 一个基Product,但仍存储Product 属性的副本;我编写了保存回调来保持两条记录的属性同步,直到用户下订单,将记录解耦。
这种设计的一个问题是products 和order_products 表之间的数据字段重复;每当我修改Product 属性时,我必须记住以同样的方式修改OrderProduct 属性和更新保存回调。此外,如果Product 具有必须复制到相应OrderProduct 的关联,则表中的重复开始变得笨拙。
我如何构建一个架构来存储这些与订单相关联的产品“快照”而不重复或重复最少?
(请注意,为了清楚起见,我在此处提供了具体的 products 和 orders 表,但我在几个不同的场景中遇到了相同的抽象问题。)
编辑:这是一个类似的问题,作者建议使用历史表来存储快照:database structure for storing historical data。接受的答案表明了我上面提出的解决方案。
【问题讨论】:
标签: ruby-on-rails database-design schema