所有这一切背后的想法是:
>所有行都必须有历史记录
>所有链接必须保持连贯
>应该很容易请求获得“当前”列
>购买过时产品的客户应该仍然可以看到他们已购买的产品,即使该产品不再是产品目录的一部分
等等.
这就是我想要做的,我将解释我面临的问题.
我的所有表都有这些列:
> 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”(=我实际上问的是什么)
解决方法
无论哪种方式,考虑为每个需要的主要区域都有一个main和main_archive表. “Main”将只有当前/活动条目,而“main_archive”将包含所有进入main的所有内容的副本.插入/更新到main_archive可以是插入/更新到main的触发器.然后,针对main_archive的删除可以在更长的时间段内运行.
对于诸如Cust X购买产品Y之类的参考问题,解决您对cust_archive的参考问题的最简单方法 – > product_archive永远不会从product_archive中删除条目.一般来说,该表中的流失率应该低得多,所以尺寸不应该太大.
HTH.