2016-04-30 73 views
1

我有一個類似20個實體的核心數據模型。我希望所有實體具有共同的屬性。例如,它們都具有創建日期屬性。 因此,我介紹了一個包含所有常用屬性的公共實體,並且所有其他實體都從此公共實體繼承。核心數據sqlite存儲單表由於繼承的缺點?

這很好,但效果很好,但是,所有實體最終都在一個SQLite表中(這很合邏輯)。

我想知道是否有明顯的缺點?例如,當每個實體的1000多個對象在現實生活中進行時,(單個)表會變得如此巨大以至於可能發生可怕的性能問題?

回答

1

這個問題已經被問過:

Core Data entity inheritance --> limitations?

Core data performances: when all entities inherit from the same parent entity

Core Data inheritance vs no inheritance

還銘記保持,當你想檢查的SQLite文件進行調試,獨立的表是更容易檢查。

我會使用一個通用的NSManagedObject子類而不是父實體。

+0

謝謝!我非常喜歡這個簡單的解釋:「我認爲唯一需要實體繼承的時間是當你需要不同的實體出現在同一個關係中時」。 –

1

不要擔心這一點。從核心數據文檔:

https://developer.apple.com/library/tvos/documentation/Cocoa/Conceptual/CoreData/Performance.html

... SQLite的存儲可以擴展到TB級數據庫與數十億行,表和列。除非您的實體本身具有非常大的屬性或大量的屬性,否則10,000個對象對於數據集而言被認爲是相當小的尺寸。

什麼方式更重要的是,如果你正在做的任何重的操作,比如獲取大量的對象,或分析基於從Web服務的一些JSON對象,你就mainthread做到這一點。這不是很難做到,查看父/子managedobjectcontexts以及如何將它們與private/main隊列併發類型一起用於managedcontextobjects。許多關於這個主題的好博客文章都存在於互聯網上。

+0

嗯...不確定。在Apple的文檔中提到:「在使用SQLite持久性存儲時,要小心實體繼承,從另一個實體繼承的所有實體都將存在於SQLite的同一個表中,SQLite持久存儲設計中的這個因素可能會導致性能問題。 (創建核心數據編程指南的管理對象部分) –

0

我一直在爲一個項目開發一個基本實體,其中包含大約20個子實體,並且現在已經有超過2年的整個50k實例。我們從來沒有選擇,插入或更新的性能問題。

使用核心數據繼承大型數據集的鍵是

  • 優化提取請求(樂曲謂詞,排除不相關的特性,預取的關係,省略子實體,設置fetchLimit,使用詞典結果類型或計數的請求如果足夠等)
  • 批量保存(意味着每次插入後不保存MOC等))
  • 建立適當的索引(它們可以加快選擇looot)
  • 適當地組織你的UI,所以你就不必加載和一個顯示幾千對象的viewController

我們甚至不因爲我們的數據模型和映射代碼是如此高度優化的,所以在導入JSON時,使用父/子managedObjectContexts或私有隊列(自己引入了很多額外的複雜性),導致UI甚至不會閃爍或掛起幾千個物體。