由于继承缺陷,核心数据sqlite存储单个表



我有一个核心数据模型,大约有20个实体。我希望所有实体都具有公共属性。例如,它们都有一个创建日期属性。因此,我引入了一个包含所有公共属性的公共实体,所有其他实体都继承自该公共实体。

这很好,工作也很好,但是,所有实体最终都在一个SQLite表中(这是相当合乎逻辑的)。

我想知道这是否有明显的缺点?例如,当在现实生活中,每个实体有1000多个对象时,(单个)表会变得如此巨大,以至于可能发生可怕的性能问题吗?

这个问题以前被问过:

核心数据实体继承-->限制?

核心数据性能:当所有实体从同一父实体继承时

核心数据继承与无继承

还要记住,当您想检查SQLite文件以进行调试时,单独的表更容易检查。

我会使用一个通用的NSManagedObject子类,而不是父实体。

不用担心。来自核心数据文档:

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

SQLite存储可以扩展到具有数十亿行、表和列的TB大小的数据库。除非实体本身具有非常大的属性或大量的属性,否则10000个对象对于一个数据集来说是相当小的。

更重要的是,如果你正在做任何繁重的操作,比如从Web服务中提取大量对象,或者基于某些JSON解析对象,你可以在主线程上执行而不是。这并不难做到,请研究父/子managedobjectcontext,以及如何将它们与具有私有/主队列并发类型的managedcontextobject一起使用。互联网上到处都是关于这个主题的好博客。

我已经在一个项目上工作了两年多,这个项目有一个基本实体,大约有20个子实体,可以轻松地创建5万个实例。我们从未在选择、插入或更新方面遇到过性能问题。

使用大数据集的核心数据继承的关键是

  • 优化的提取请求(调优谓词、排除不相关的属性、预取关系、省略子项、设置fetchLimit、使用字典结果类型或计数请求(如果足够)等)
  • 批量保存(意味着每次插入后不保存MOC等)
  • 设置适当的索引(它们可以加快选择looot的速度)
  • 适当地构建您的UI,这样您就不必在一个viewController中加载和显示数千个对象

在导入JSON时,我们甚至不使用父/子managedObjectContexts或私有队列(它们本身会带来很多额外的复杂性),因为我们的数据模型和映射代码经过了高度优化,因此在导入几千个对象时,UI甚至不会显着闪烁或挂起。

最新更新