从对象图中删除对象,同时保持完整性



在关系数据库中,在保持引用完整性的同时,处理从对象图中删除对象的最佳方法是什么?在某种程度上,这是必须的。通过软删除或硬删除。

例如,当一个产品被移除时,确保包含该产品的订单仍然相关的最佳方法是什么,或者确保包含该商品的订单的发票仍然相关?

基本上有3种"标准解决方案":

解决方案1

你需要产品(就像你的情况一样,因为发票引用了它)。这意味着数据是有效的,唯一的变化是它"缺货"或"缺货"。在任何情况下,您的业务流程通常需要您处理RMA情况或一些与IRS相关的事项,例如。。。这意味着产品不能被删除。这只是产品的一种不同"状态",需要通过您的数据库数据模型等来反映。

如果您关心性能,请进行一些分析。。。如果需要的话,你有很多优化选项。。。这些通常依赖于RDBMS,其中一种技术是"分区"——每个RDBMS都有自己的机制,在灵活性等方面有所不同。

解决方案2

你根本不需要任何数据。。。只需执行级联删除并完成即可…

解决方案3

您只需要历史数据,但"未来的业务流程"将不再需要此实体(即产品)。。。在这种情况下,一个常见的解决方案是在对"活动/生产表"执行临时删除之前,先填充归档表。该方案的一个微小变体是将所需信息复制到"相关行"(在您的情况下为发票)中,然后只删除活动/生产行(在您情况下为产品)。

结论

复杂的系统处理许多不同的业务流程/用例,因此倾向于采用上述所有技术——每种技术都有其位置,这取决于所涉及的特定业务流程/使用案例。。。

这是我从一个匿名来源收到的答案。我要说的是,他很受尊重,为了表示尊重,我不会公布他的名字。

我不会在这里接受我自己的答案,也不会绕过赏金,但我只是在展示他的答案。

使用功能齐全的RDBMS,您可以在"deleted_or_not"列上对表进行分区,这将导致所有实际生产行都被紧凑地存储。如果您不希望不推荐使用的数据显示在报告中,只需为整个表指定一个模糊的名称,如customer_including_deleted_rows,并创建一个视图"customers"(仅包含实际行)大多数应用程序代码都从中查询。当然,这是假设保留旧数据有一定的价值。"

最新更新