在关系数据库中,处理从对象图中删除对象,同时仍然保留引用完整性的最佳方法是什么?在某种程度上,这是必须发生的。通过软删除或硬删除。
例如,当产品被移除时,确保包含该产品的订单仍然相关的最佳方法是什么,或者进一步确保包含包含该产品的订单的发票仍然相关?
发布于 2012-04-05 08:14:55
基本上有3种“标准解决方案”:
解决方案1
您需要该产品(就像您的案例一样,因为发票引用了它)。这意味着数据是有效的,唯一的变化是它“脱销”或“脱销”。在任何情况下,您的业务流程通常都需要您处理RMA情况或一些与IRS相关的问题,例如……这意味着不能删除该产品。这只是一个不同的“状态”的产品,需要反映在您的数据库数据模型等。
如果您关心的是性能,请执行一些分析...如果需要,您有许多优化选项...它们通常依赖于RDBMS,其中一种技术是“分区”--每个RDBMS都有自己的机制,这些机制在灵活性等方面存在差异。
解决方案2
你根本不需要任何数据...只要做一个级联删除就可以了……
解决方案3
您只需要历史数据,但“未来的业务流程”将不再需要此实体(即产品)……在这种情况下,一种常见的解决方案是在对“活动/生产表”执行级联删除之前填充存档表。此方案的一个小变体是将所需的信息复制到“依赖行”(在您的情况下是发票),并只删除活动/生产行(即在您的情况下是产品)。
结论
复杂的系统处理许多不同的业务流程/用例,因此倾向于采用上述所有技术-每种技术都根据涉及的特定业务流程/用例而定……
发布于 2012-04-05 20:37:29
这是我从一位未透露姓名的来源得到的答案。我要说的是,他非常受人尊敬,出于尊重,我不会公布他的名字。
我不会在这里接受我自己的答案,也不会绕过赏金,而只是展示他的答案。
“使用功能齐全的关系型数据库管理系统,您可以在"deleted_or_not”列上对表进行分区,这将导致所有实时生产行被压缩存储。如果您不希望过时的数据显示在报表中,只需为整个表指定一个晦涩的名称,如customers_including_deleted_rows,并创建一个视图"customers“(仅包含活动行),大多数应用程序代码都从该视图中查询。当然,这假设保留旧数据有一定的价值。”
https://stackoverflow.com/questions/9896674
复制