在关系数据库中,处理从对象图中删除对象同时仍保持引用完整性的最佳方法是什么?在某些时候,这必须发生。通过软删除或硬删除。
例如 - 当产品被移除时,确保包含该产品的订单仍然相关,或者确保包含该产品的订单的发票仍然相关的最佳方法是什么?
在关系数据库中,处理从对象图中删除对象同时仍保持引用完整性的最佳方法是什么?在某些时候,这必须发生。通过软删除或硬删除。
例如 - 当产品被移除时,确保包含该产品的订单仍然相关,或者确保包含该产品的订单的发票仍然相关的最佳方法是什么?
基本上有3种“标准解决方案”:
解决方案 1
您需要该产品(就像您的情况一样,因为引用它的发票)。这意味着数据是有效的,唯一的变化是它“缺货”或“缺货”。在任何情况下,您的业务流程通常需要您处理 RMA 情况或一些 IRS 相关事务,例如......这意味着不得删除产品。这只是产品的不同“状态”,需要由您的数据库数据模型等反映。
如果您关心性能,请进行一些分析...如果需要,您有多种优化选项...这些通常依赖于 RDBMS,其中一种技术是“分区”-每个 RDBMS 都有自己的机制,这些机制在灵活性等方面有所不同.
解决方案 2
您根本不需要任何数据......只需进行级联删除并完成它......
解决方案 3
您只需要历史数据,但“未来的业务流程”将不再需要该实体(即产品)......在这种情况下,一个常见的解决方案是在对“活动/生产”进行级联删除之前填充归档表表”。该方案的一个轻微变体是将所需信息复制到“相关行”(您的情况下为发票),然后删除活动/生产行(即您的情况下的产品)。
结论
复杂的系统处理许多不同的业务流程/用例,因此倾向于采用上述所有技术——每种技术都有其所涉及的特定业务流程/用例......
这是我从一个未命名的来源收到的答案。我会这么说,他很受尊重,为了尊重,我不会公布他的名字。
我不会在这里接受我自己的答案,也不会绕过赏金,而只是展示他的答案。
“使用功能齐全的 RDBMS,您可以在“deleted_or_not”列上对表进行分区,这将导致所有实时生产行都被紧凑地存储。如果您不希望不推荐使用的数据显示在报告中,只需给出完整的表有一个晦涩的名称,例如customers_including_deleted_rows 并创建一个视图“customers”(仅包含实时行),大多数应用程序代码都从该视图中查询。当然,这假设拥有旧数据有一些价值。”