【问题标题】:Remove object from object graph while retaining integrity从对象图中删除对象,同时保持完整性
【发布时间】:2012-03-27 19:52:04
【问题描述】:

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

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

【问题讨论】:

  • 这个问题很重要,一些非常可靠的消息来源已经承认了这个问题。

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


【解决方案1】:

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

解决方案 1

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

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

解决方案 2

您根本不需要任何数据...只需执行级联删除并完成它...

解决方案 3

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

结论

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

【讨论】:

    【解决方案2】:

    这是我从未透露姓名的来源收到的答案。我会这么说,他很受尊重,为了尊重,我不会公布他的名字。

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

    “使用功能齐全的 RDBMS,您可以在“deleted_or_not”列上对表进行分区,这样可以紧凑地存储所有实时生产行。如果您不希望在报告中显示已弃用的数据, 只需给整个表起一个晦涩的名称,例如customers_including_deleted_rows 并创建一个视图“customers”(仅包含活动行),大多数应用程序代码都从该视图中查询。当然,这假设拥有旧数据。”

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2015-07-26
      • 2021-09-11
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多