2010-07-15 62 views
4

如果我發現自己想要對存儲在我的關係數據庫中的對象進行深層複製,是否必須在架構上做一些根本性錯誤?這是另一個問題(更詳細的問題),我問了一個不同的角度,但沒有得到很多回應稱爲Copying Relational Table Data數據庫和深度複製

回答

1

這取決於您的關係表代表什麼,以及您的哪些實體組合在一起以構建「業務對象」。例如,如果您有一個內容管理系統的關係模型,其中包含一個「Postings」表和一個「Text_lines」表,每個Posting包含一個文本行列表,那麼您的業務對象「Posting」的有效副本將最有可能成爲「Postings」實體以及所屬Text_lines實體的深層副本。

另一方面,如果有兩個表「部門」和「員工」,部門的正確副本最有可能不是深層副本(至少,如果每個員工只在一個點與一個部門相關聯及時)。在關係數據庫方案中,這些差異常常與分配給關係的參照完整性檢查並行。可以使用具有「ON DELETE CASCADE」完整性的外鍵約束來建模關係「Postings」 - >「Text_lines」(當然,如果數據庫支持的話)。然而,「部門」 - >「員工」不應該在它上面有這樣的「ON DELETE CASCADE」檢查。

2

不一定。我自己做了這個,並取得了很大的成功來實現版本控制方案。基本上可以對整個圖進行版本控制(使用compite密鑰,其中密鑰的一部分是事物ID,另一部分是版本號),我們可以輕鬆訪問所有以前版本的圖或子圖。

要清楚的是,DB架構師推薦這個方案;他的觀點有很大的影響力,解決方案並不是我的第一選擇。但最終它運作得非常好。

2

通常,如果複製父對象,則只需將引用複製到子對象,而不是對象本身。但是,有些情況下,像保留特定時間點的對象狀態,需要複製子對象。所以,要回答你的問題,這個場景應該讓你停下來思考,但並不意味着你做錯了什麼。

2

我認爲,如果你需要一個數據庫對象的彈性克隆,那麼你最好的辦法就是執行一個深層複製 - 至少複製所有那些在未來某個時候可能會改變的項目。我沒有看到除了實現一些寫入時複製風格的'克隆'以外,還有很多其他選擇,雖然在某些情況下它可能是正確的,但會引入複雜的額外邏輯。