9 database oracle database-design partitioning
与许多数据库一样,我正在设计一个数据库,该数据库应记录每个表中更改的行的先前版本.
此问题的标准解决方案是为每个数据表保留历史表,并且每当需要在数据表中更新行时,当前行的副本将插入到历史表中而不是数据表中的行得到更新.
这个解决方案的缺点对我来说:
我正在考虑一个不同的解决方案,并想知道它是否正常.对于每个表,我们添加列IS_LAST
假设在我的情况下,行平均更新10次.还假设应用程序执行的操作中至少有90%仅在最新版本的行上发生.
我的数据库是一个Oracle 10g,所以为了使"活动"表保持苗条,我们可以将表拆分为2个分区:IS_LAST = 1分区和IS_LAST = 0分区.
分区是解决历史数据保持问题的好方法吗?
此解决方案是否限制了这些表的其他分区潜力?
谢谢!
第一个问题应该是:你会对这些数据做些什么?如果您没有明确的业务要求,请不要这样做.
我做了类似的事情,经过3年的运行,大约有20%的"有效数据",其余的是"以前的版本".它有1000万+ 4000万条记录.在过去三年中,我们有两(2)次调查变更历史的请求,两次请求都是愚蠢的 - 我们记录了记录变更的时间戳,我们被要求检查人员是否加班(下午5点之后).
现在,我们陷入了超大型数据库,其中包含80%无人需要的数据.
编辑:
既然你问了可能的解决方案,我会描述我们做了什么.它与您正在考虑的解决方案略有不同.
我们使用以下列记录单个归档表中的所有更改:
这样做是这样的:
优点:
缺点:
LIKE在字符串上使用运算符.因此,再次检查存档的要求.这不是一项微不足道的任务,但收益和使用可以是最小的.
我将创建两张表:一张用于 IsLast 类型的值,一张用于历史值。然后我会设置一个触发器,每次更新 isLast 时都会将值插入到历史表中。