我有一個非常簡單的核心數據模型,包含一個包含多個圖像的圖庫。在我看來,畫廊與圖像具有一對多關係就足夠了,但是如果我也不建立從圖像到圖庫的反向關係,則會出現編譯器警告和錯誤。從面向對象的角度來看,在我看來,Image不應該知道或關心它是否在Gallery或任何其他ManagedObject中,那麼爲什麼編譯器會迫使我創建這種反向關係?在圖片上擁有「圖庫」屬性似乎非常錯誤。爲什麼一個實體需要一個逆?
2
A
回答
8
核心數據使用反比關係來幫助保持參照完整性。當你改變一個關係或刪除一個對象時,它會顯着提高性能。如果沒有相反的情況,那些相同的操作可能會導致全表掃描。
在我看來,沒有反轉應該是一個錯誤,而不是一個警告。在一些相當常見的情況下,這種差別可能會很大。
想象一下沒有它們的多實體級聯刪除。可能花費足夠的時間,操作系統認爲你的應用程序崩潰了。
0
我認爲你不能將oo原則應用於數據庫結構 - 它們不在同一個域中。核心數據是關於表和行以及它們之間的指針。讓我們看看參照完整性和您的畫廊的例子。如果您沒有圖片與圖庫的關係,則當您刪除圖像時,系統將不知道刪除圖庫中的參考。你可能會認爲這種細節應該被照顧,但我認爲你是這樣的,你應該只是忍受它。也許發送一個錯誤報告給蘋果公司..
+0
是的。我認爲問題在於受管對象是對象,但它們仍受數據庫結構規則的約束。我不應該關心反向引用。這是應該在幕後處理的細節。 – Undistraction
相關問題
- 1. 爲什麼我需要一個需要實例的方法?
- 2. 爲什麼實體有時需要一個「url」參數,有時不需要?
- 3. 爲什麼需要關係表從實體到同一實體
- 4. 爲什麼try塊需要一個catch
- 5. 爲什麼Fortran POINTER需要一個TARGET?
- 6. 爲什麼你需要一個Hyper-V?
- 7. 爲什麼需要一個會話bean?
- 8. 爲什麼這裏需要一個鎖?
- 9. 爲什麼eclipse需要一個名爲'main'的實際方法?
- 10. 爲什麼地點是一個實體?
- 11. 爲什麼需要一個變量指向一個結構
- 12. 爲什麼一個radiobuttonlist總是需要一個新的行?
- 13. 爲什麼我需要顯式實例化一個對象?
- 14. 爲什麼我需要將兩個對象合併爲一個?
- 15. 爲什麼我要爲一個匿名類「需要opCmp」?
- 16. 爲什麼我需要在調用另一個對象上的ApplyCurrentValues之前得到一箇舊實體?
- 17. 爲什麼用iText複製一個PDF不需要嵌入一些字體?
- 18. 爲什麼pandas groupby()。transform()需要一個唯一的索引?
- 19. 爲什麼這個正則表達式需要一個空間?
- 20. 爲什麼這個查詢需要一個參數?
- 21. 兩個查詢。相同的輸出。一個需要2個小時,另一個需要0秒。爲什麼?
- 22. 爲什麼Go需要這麼多CPU來構建一個包?
- 23. 需要一個唯一的JPA實體列表
- 24. 爲什麼我需要爲音頻創建一個sharedInstance?
- 25. 爲什麼你需要一個爲Html.Action定義的路由?
- 26. 爲什麼'自我'需要成爲一個函數參數?
- 27. 一個實現一個界面,需要一個枚舉
- 28. 爲什麼EclipseLink會爲同一個實體查詢兩次?
- 29. 爲什麼一個子類需要實現一個父母界面來隱藏C#中父母方法之一?
- 30. 爲什麼要爲JAX-RS實現聲明一個接口?
這就是他們總是說。 「參照完整性。」這對我來說沒有意義。如果一個實體有一個逆,那麼我可以看到它是如何聲明的。但是,如果在OP的情況下,圖像沒有對圖庫的引用,如果圖庫被刪除,或圖像從圖庫中刪除等,圖像上的任何內容都不需要改變。 – morningstar
我認爲你是對的,它更多與性能有關。如果是這樣的話,爲什麼Core Data不能提供一個自動幕後逆轉?或者是否有一些情況不可能自動推斷出什麼是倒數? – morningstar
謝謝。我不能假裝理解你的答案,因爲我對這個領域沒有很好的瞭解,但是如果它具有更高的性能,我認爲這是一個足夠好的理由。然而徹底破壞封裝似乎是一個可怕的代價。在由User:Galleries:Gallery:Image構成的對象圖中,Image可以獲得對User的引用,這只是錯誤的。 – Undistraction