2011-10-15 28 views
2

我有一個非常簡單的核心數據模型,包含一個包含多個圖像的圖庫。在我看來,畫廊與圖像具有一對多關係就足夠了,但是如果我也不建立從圖像到圖庫的反向關係,則會出現編譯器警告和錯誤。從面向對象的角度來看,在我看來,Image不應該知道或關心它是否在Gallery或任何其他ManagedObject中,那麼爲什麼編譯器會迫使我創建這種反向關係?在圖片上擁有「圖庫」屬性似乎非常錯誤。爲什麼一個實體需要一個逆?

回答

8

核心數據使用反比關係來幫助保持參照完整性。當你改變一個關係或刪除一個對象時,它會顯着提高性能。如果沒有相反的情況,那些相同的操作可能會導致全表掃描。

在我看來,沒有反轉應該是一個錯誤,而不是一個警告。在一些相當常見的情況下,這種差別可能會很大。

想象一下沒有它們的多實體級聯刪除。可能花費足夠的時間,操作系統認爲你的應用程序崩潰了。

+0

這就是他們總是說。 「參照完整性。」這對我來說沒有意義。如果一個實體有一個逆,那麼我可以看到它是如何聲明的。但是,如果在OP的情況下,圖像沒有對圖庫的引用,如果圖庫被刪除,或圖像從圖庫中刪除等,圖像上的任何內容都不需要改變。 – morningstar

+0

我認爲你是對的,它更多與性能有關。如果是這樣的話,爲什麼Core Data不能提供一個自動幕後逆轉?或者是否有一些情況不可能自動推斷出什麼是倒數? – morningstar

+0

謝謝。我不能假裝理解你的答案,因爲我對這個領域沒有很好的瞭解,但是如果它具有更高的性能,我認爲這是一個足夠好的理由。然而徹底破壞封裝似乎是一個可怕的代價。在由User:Galleries:Gallery:Image構成的對象圖中,Image可以獲得對User的引用,這只是錯誤的。 – Undistraction

0

我認爲你不能將oo原則應用於數據庫結構 - 它們不在同一個域中。核心數據是關於表和行以及它們之間的指針。讓我們看看參照完整性和您的畫廊的例子。如果您沒有圖片與圖庫的關係,則當您刪除圖像時,系統將不知道刪除圖庫中的參考。你可能會認爲這種細節應該被照顧,但我認爲你是這樣的,你應該只是忍受它。也許發送一個錯誤報告給蘋果公司..

+0

是的。我認爲問題在於受管對象是對象,但它們仍受數據庫結構規則的約束。我不應該關心反向引用。這是應該在幕後處理的細節。 – Undistraction

相關問題