数据库设计 – 数据库设计:如何处理“归档”问题?

前端之家收集整理的这篇文章主要介绍了数据库设计 – 数据库设计:如何处理“归档”问题?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我很确定很多应用程序,关键应用程序,银行等每天都会这样做.

所有这一切背后的想法是:

>所有行都必须有历史记录
>所有链接必须保持连贯
>应该很容易请求获得“当前”列
>购买过时产品的客户应该仍然可以看到他们已购买的产品,即使该产品不再是产品目录的一部分

等等.

这就是我想要做的,我将解释我面临的问题.

我的所有表都有这些列:

> id
> id_origin
>创建日期
>开始有效日期
>开始有效期结束

以下是CRUD操作的想法:

> create =插入id_origin = id的新行,创建日期=现在,有效期的开始日期=现在,有效期的结束日期= null(=表示它是当前的活动记录)
> update =

> read =读取结束日期有效的所有记录== null
>更新“当前”记录的有效期结束日期= null,结束日期为有效期=现在
>使用新值创建一个新值,并且有效期的结束日期= null(=表示它是当前活动记录)

> delete =更新“当前”记录的有效期结束日期= null,结束日期为有效期=现在

所以这是我的问题:与多对多关联.让我们举个值的例子:

>表A(id = 1,id_origin = 1,start = now,end = null)
>表A_B(start = now,end = null,id_A = 1,id_B = 48)
>表B(id = 48,id_origin = 48,end = null)

现在我想更新表A,记录id = 1

>我用end = now标记记录id = 1
>我在表A中插入一个新值并且…该死的我已经失去了我的关系A_B,除非我复制了这个关系……这将结束于一个表:
>表A(id = 1,end = now 8mn)
>表A(id = 2,start = now 8mn,id_B = 48)
>表A_B(start = now,id_A = 2,end = null)

并且…我有另一个问题:关系A_B:我应该将(id_A = 1,id_B = 48)标记为过时或不过(A – id = 1已过时,但不是B – 48)?

怎么处理这个?

我必须大规模地设计它:产品,合作伙伴等.

你对此有什么经历?你会怎么做(你过得怎么样)?


编辑

我找到了this very interesting article,但它没有正确处理“cascasding obsolescence”(=我实际上问的是什么)

解决方法

我不清楚这些要求是用于审计目的还是仅仅是简单的历史参考,例如CRM和购物车.

无论哪种方式,考虑为每个需要的主要区域都有一个main和main_archive表. “Main”将只有当前/活动条目,而“main_archive”将包含所有进入main的所有内容的副本.插入/更新到main_archive可以是插入/更新到main的触发器.然后,针对main_archive的删除可以在更长的时间段内运行.

对于诸如Cust X购买产品Y之类的参考问题,解决您对cust_archive的参考问题的最简单方法 – > product_archive永远不会从product_archive中删除条目.一般来说,该表中的流失率应该低得多,所以尺寸不应该太大.

HTH.

猜你在找的MsSQL相关文章