【发布时间】:2014-04-05 17:15:12
【问题描述】:
当涉及到具有“历史性”的关系时,我会在各种选择之间犹豫不决
价值。
例如,假设用户在某个日期购买了一件物品......如果我只是以经典方式存储它:
transation_id: 1
user_id: 2
item_id: 3
created_at: 01/02/2010
那么很明显,用户可能会更改其名称,商品可能会更改其价格,并且 3 年后,当我尝试创建发生事件的报告时,我得到了虚假数据。
我有两种选择:
-
像我之前展示的那样保持愚蠢,但使用 https://github.com/airblade/paper_trail 之类的东西并执行以下操作:
t = Transaction.find(1); u = t.user.version_at(t.created_at) -
创建一个类似
transaction_users和transaction_items的数据库,并在进行事务时将用户/项目复制到这些表中。然后结构将变为:transation_id: 1 transaction_user_id: 2 transaction_item_id: 3 created_at: 01/02/2010
这两种方法都有其优点,但解决方案 1 看起来要简单得多……您发现解决方案 1 有问题吗?这个“历史数据”问题通常是如何解决的?对于我的项目,我必须为 2-3 个这样的模型解决这个问题,你认为最好的解决方案是什么?
【问题讨论】:
-
你买得起 DB2 吗? :)
-
@NeilMcGuigan:呵呵,不。我想我会选择 PaperTrail,它保留了我所有模型的历史,甚至它们的破坏。如果它不能扩展,我总是可以稍后切换到第 2 点。
标签: ruby-on-rails design-patterns database-design relational-database paper-trail-gem