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

我很确定很多应用程序,关键应用程序,银行等每天都会这样做.

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

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

等等.

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

我的所有表都有这些列:

> 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.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...