2012-03-27 67 views
2

在關係數據庫中,處理從對象圖中移除對象同時仍保留參照完整性的最佳方法是什麼?在某個時候,這必須發生。通過軟刪除或硬刪除。在保持完整性的同時從對象圖中移除對象

例如,當產品被移除時,確保含有該產品的訂單仍然相關的最佳方法是什麼,或者含有該產品的訂單的發票仍然相關?

+0

這個問題很重要,這個問題已經被一些非常可信的來源所承認。 – 2012-04-04 22:50:46

回答

2

基本上有3「標準解決方案」:

解決方案1 ​​

你(你的情況一樣,因爲發票引用它)所需要的產品。這意味着數據是有效的,唯一的變化是它「缺貨」或「超出投資組合」。無論如何,您的業務流程往往需要您處理RMA情況或與IRS相關的問題,例如......這意味着該產品不能被刪除。這只是產品的不同「狀態」,需要通過您的數據庫數據模型等來反映。

如果您關心性能,請執行一些性能分析......如果需要,您可以獲得多種優化選項。 ..這些通常是RDBMS相關,一個技術被「分割」 - 每個RDBMS都有自己的機制,其靈活性等不同

解決方案2

你不需要任何數據在所有...只是做一個級聯刪除並完成它...

解決方案3

您只需要歷史數據,但是「未來的業務流程」永遠不需要這個實體。產品)......在這種情況下,常見的解決方案是在「活動/生產表」上進行級聯刪除之前填充歸檔表。這種方案的一個細微變體是將所需信息複製到「依賴行」(您的案例中的發票),並刪除活動/生產行(即您的案例中的產品)。

結論

複雜的系統處理很多不同的業務流程/用例,因此傾向於採用上述所有技術 - 每個人都有自己的位置depeding所涉及的具體業務流程/用例。 ..

0

這是我從一個未命名的來源收到的答案。我會說這個,他很受尊敬,並且很尊重我不會張貼他的名字。

我不打算接受我自己的答案,或繞過賞金,但只是顯示他的答案。

「使用全功能的RDBMS,您可以將表格分區到」deleted_or_not「列,這將導致所有實時生產行緊湊存儲。如果不希望棄用的數據顯示在報告,只需給整個表格一個晦澀的名字,例如customers_including_deleted_rows,並創建一個「客戶」(只包含活動行)的視圖,大多數應用程序代碼查詢就是這樣。當然,這假設有一些價值周圍的舊數據。「