核心数据继承 - 管理子类的反向关系
Posted
技术标签:
【中文标题】核心数据继承 - 管理子类的反向关系【英文标题】:Core Data Inheritance - Manage Inverse relationships of subclasses 【发布时间】:2020-03-05 11:50:23 【问题描述】:我是 CoreData 环境的新手,我正在尝试了解它是如何工作的。
在我的项目中,我有一个超类VetExam
,其子类是Examination
、Treatments
和Vaccination
,它们共享其超类的相同属性并引用Pet
类。另一方面,Pet
类包含除 VetExam
之外的每个类的引用数组,它应该只用于多态(这样我就可以使用 VetExam
对象并为每种类型创建一个视图)。
基于此模型,我尝试在 CoreData 中创建实体,但似乎我必须为每种类型指定每个实体的反向关系。这代表了一个问题,因为从VetExam
实体端,关系是Pet
类型,但在Pet
端,每种考试类型都是多对多,这不允许我得到VetExam
的反向引用。
由于这种解释很容易被误解,我将向您展示它的视觉表示。
问题出在VetExam
实体中,其 Inverse 属性未知。
有谁知道如何处理这种情况?
【问题讨论】:
要么没有从 VetExam 到 Pet 的关系,而是从子类到 Pet 的关系,或者在 Pet 到 VetExam 中只有一对多的关系,或者可能在这里放弃使用继承并让 Exam,治疗和疫苗接种是 3 个独立的实体。从长远来看,最后一个选项可能是最简单的,即使您必须复制一些属性。 放弃继承意味着改变应用结构,因为它不依赖核心数据atm 【参考方案1】:关于继承的初步说明...
Class inheritance
与
Entity inheritance
其次,我在 Apple 文档中突出显示注释:
使用 SQLite 持久化时要小心实体继承 商店。从另一个实体继承的所有实体都存在于 SQLite 中的同一张表。 SQLite 设计中的这个因素 持久存储可能会产生性能问题。
这意味着 Core Data 框架在 SQLite 数据库中创建了一个包含父实体和子实体的大表。这么大的表本身就包含了低效率。虽然这对您现在在模型编辑器和 NSManagedObject 子类中进行管理似乎很方便,但如果您希望您的应用程序在您提到的四个实体中持久保存和检索大量数据,从长远来看,这可能会导致效率低下/性能问题.
其他人的建议在这里非常重要,因为在我看来,四个独立的实体会更容易管理,而不是一个父实体和三个子实体。如果选择此选项,您不必放弃在代码中开发的类继承。
所以,回答你的问题...
我的逻辑:
每只宠物在其一生中可能有多次 VetExam 实例,但每次 VetExam 实例只针对一只宠物进行?
如果是,则在 Pet 和 VetExam 之间创建一对多关系 -
Pet <—>> VetExam.
VetExam 期间发生的任何事情都是一项检查、治疗和/或疫苗接种的任意组合。也就是说,为了清楚起见,VetExam 可以选择进行检查,但它可能没有治疗或疫苗接种。这可能会因每次 VetExam 而发生变化,因此这与 VetExam 直接相关,而不是与宠物相关。
如果是,则在 VetExam 与实体检查、治疗和疫苗接种之间创建可选的一对一关系。
VetExam <—> Examination
VetExam <—> Treatment
VetExam <—> Vaccination
在这个模型中,上面详述的每个实体关系都有一个逆向关系。
最后,可能值得注意的是,在这个提议的模型中,宠物与其在其生命周期内接受的所有检查、治疗和疫苗接种之间的关系是针对 PetExam 存储的,而不是直接针对宠物。
【讨论】:
以上是关于核心数据继承 - 管理子类的反向关系的主要内容,如果未能解决你的问题,请参考以下文章