2011-04-26 122 views
5

你有哪些建议,为什么?版本控制每个字段与历史日期字段?

我有几张表格,当我对数据进行更改时...它应该转到具有生效日期的历史记录表(审核)。

另一种解决方案是对每个字段进行版本控制,以在对数据进行更改时插入新行?

这是发票信息的最佳方法?商品名称和价格总是变化

回答

4

这些是slowly changing dimensions,type 2type 4,适当。

这两种方法都是有效的,可能更适合您的需求,具体取决于您的模型和查询要求。

基本上,type 2(版本)是当你需要经常查询历史值作为当前一个比较合适的,而type 4(历史记录表)是当你更经常查询的电流值更适合,并有更多的疑问(更多查询开发我的意思)与最近的价值。

+0

我有一个order_items来显示过去的订单..哪一个更好?商品名称和价格的价值总是在变化。 – user622378 2011-04-26 13:01:06

+0

@user:通常(通常)历史记录表更好,因为您需要当前价格更重要,并且针对它运行更多查询。这样,您就不需要在每个查询的'isActive'或类似字段上添加一个过滤器。 – Quassnoi 2011-04-26 13:03:11

+0

而不是历史表中的DATE,我添加了版本字段。表的示例:item.version,item_history.version和order_table表将包含版本号。所以我会得到100%准确的信息,而不是在日期搜索中继续。 – user622378 2011-04-26 14:07:01

2

我们使用并乐于使用的系统:
每个需要历史记录的表,我们创建一个类似的表,并在末尾添加一个时间戳字段,它将成为PK的一部分。
在原表中的每个更新,我们插入到历史表在相同的条件:

update table x WHERE somthing something 

insert into table x_history 
select * from x WHERE something something 

,让您的数据清理和你的表渺茫。

+0

这个解决方案的准确性没有问题吗?例如..显示发票数据从历史表(旧数据)..我希望它显示正确的价格大声笑 – user622378 2011-04-26 13:03:44

+0

为什么应该有一个问题?你可以使用版本控制,但它涉及更多的逻辑/代码,我觉得没有必要 – 2011-04-26 14:29:14

0

我的个人偏好是在您的应用程序中使用Observer Pattern并实现单独的历史记录表。这意味着您可以在需要时从历史记录表中提取数据,而且不会降低查询主表的速度。