我对核心数据世界很陌生。我的应用程序通过api获取电影和电视节目数据。 Movie和TvShow托管对象都具有类似的属性。我对设置模型的最佳方法仍然感到困惑。这是我目前所实现的,我想知道如何才能制作出更高效的模型。
最好是拥有一个具有相似属性的整体mediaObject,然后将movie和tvshow作为一种子类吗? (如果是这样我怎么能实现它)
答案 0 :(得分:2)
当你有两个具有相似属性的实体时,它(有时)可以使用“父实体”来保存它们共有的属性(或关系)。为此,请创建一个实体(例如您建议的MediaObject
)并为其定义所有常用属性。然后从“子”实体(TVSeries
和Movie
)中删除这些属性,而将MediaObject
设置为父实体 - 这是在右侧的数据模型检查器中设置的。你应该有这样的东西:
我怀疑还有待进一步改进 - 例如。 name
上的TVSeries
属性可能等同于title
上的Movie
,因此可以重命名并移至父MediaObject
等。
其他一些想法:您原来的genre
关系只有一个:一个Movie
可能有很多Genres
,但每个Genre
只能有一个Movie
}}。我想您可能想要撤消这一点,因此每个Movie
只属于一个Genre
,但每个Genre
可以有多个Movies
,或者可能有多个tvShows
关系。另请注意,通常的做法是为多对多关系使用复数名称,例如。 tvShow
而不是id
。这只是使意图更清晰。另外,我会避免mediaId
作为属性名称;它太泛型:genreId
,TVSeries
等会更好。
如果使用“Create NSManagedObject Subclasses”菜单选项,Xcode将为所有实体创建单独的类,Movie
和MediaObject
类均为dplyr
的子类(而这又是NSManagedObject的子类。每个子类的属性定义反映了相应实体的属性和关系。
我从一个附带条件开始:有时有意义使用父实体。谨慎的原因是,在实践中,Core Data将父/子实体实现为单个SQL表 - 包含父和所有子项的所有属性/关系。 CoreData会隐藏这个实现细节 - 但是可能会对性能产生影响:表格会“宽” - 很多列 - 其中很多列都是空的,因为它们与不同的子实体有关。你会在Stack Overflow上发现关于这个问题的大量问答,有些人选择不使用父实体,因为性能受到太大影响。您需要根据可能的数据量,查询的复杂性等对自己进行评估。