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

时间:2012-03-27 19:52:04

标签: relational-database data-integrity object-graph

在关系数据库中,处理从对象图中删除对象同时仍保留参照完整性的最佳方法是什么?在某些时候,这必须发生。通过软删除或硬删除。

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

2 个答案:

答案 0 :(得分:2)

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

解决方案1 ​​

您需要产品(就像您的情况一样,因为发票引用了它)。这意味着数据是有效的,唯一的变化是它“缺货”或“缺乏投资组合”。在任何情况下,您的业务流程通常都需要您处理RMA情况或某些IRS相关事项,例如......这意味着不得删除产品。这只是产品的一个不同“状态”,需要通过DB数据模型等反映出来。

如果您关注性能,请进行一些分析...如果需要,您有多种优化选项......这些通常依赖于RDBMS,一种技术是“分区” - 每个RDBMS都有自己的不同的机制灵活性等。

解决方案2

您根本不需要任何数据......只需进行级联删除即可完成...

解决方案3

您只需要历史数据,但没有“未来的业务流程”将再次需要此实体(即产品)...在这种情况下,一个常见的解决方案是在对“执行级联删除之前填充存档表”活跃/富有成效的表格“。这种方案的一个略微变体是将所需信息复制到“从属行”(在您的情况下为发票),然后删除活动/生产行(即您的情况下的产品)。

结论

复杂系统处理许多不同的业务流程/用例,因此倾向于采用上述所有技术 - 每个技术都取决于所涉及的特定业务流程/用例......

答案 1 :(得分:0)

这是我从一个未命名的来源收到的答案。我会这样说,他非常受尊重,为了尊重我不会发表他的名字。

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

"使用功能齐全的RDBMS,您可以在" deleted_or_not"上对表进行分区。列,这将导致所有实时生产行紧凑地存储。如果您不希望已弃用的数据显示在报告中,只需为完整表格提供一个不起眼的名称,例如customers_including_deleted_rows,并创建一个视图" customers" (仅包含实时行),大多数应用程序代码从中查询。当然,这假设有旧数据存在一些价值。"