提问人:Shawn Throop 提问时间:7/18/2022 最后编辑:ShadowShawn Throop 更新时间:7/19/2022 访问量:105
是否可以建立自引用的一对多核心数据关系?
Is a self referential one-to-many Core Data relationship possible?
问:
我正在学习使用核心数据,并且对数据建模有一些想法。作为一个试图学习德语的人,我正在制作一本短语日志和它们周围的一些上下文,例如文本的语言、注释和可能的翻译。
第一个想法
这是一个非常简化的模型:
class Phrase: NSManagedObject {
@NSManaged var text: String
@NSManaged var language: String
@NSManaged var translations: Set<Phrase>
@NSManaged var note: String?
}
该属性将是一对多关系。考虑到 Core Data 存储数据的方式,这是否可能?translations
第二个想法
在我的研究中,听起来我可能需要一个中间对象来促进连接表。更像是这样的东西:
class Phrase: NSManagedObject {
@NSManaged var text: String
@NSManaged var language: String
@NSManaged var translations: Set<Translation> // one-to-many: Translation.input
@NSManaged var note: String?
}
class Translation: NSManagedObject {
@NSManaged var input: Phrase // one-to-many: Phrase.translations
@NSManaged var text: String
@NSManaged var language: String
@NSManaged var note: String?
}
结论
我觉得我可能想错了问题。这种结构有更好的模型吗?
答:
1赞
Tom Harrington
7/19/2022
#1
这两种方法都可以使用,但重要的是要了解核心数据与关系数据库的不同之处。在这两种情况下,Core Data 都会抱怨没有反比关系。它希望在两端都有关系的属性。在第一种情况下,它会期待你可能会调用的第二种关系或其他东西。您永远不需要使用这种关系,但最好将其用于 Core Data 的内部使用。translatedFrom
除此之外,您还可以使用任何一种方法。第二种方法的优点是,您可以分别从每个短语中添加有关翻译的注释或其他数据。但是,如果您不需要它,请不要为第二个实体而烦恼。
评论
0赞
Shawn Throop
7/19/2022
感谢您的见解。对于我的第一个想法,我将尝试添加一个属性,但我不确定这应该是一个还是只是一个.我觉得两者都应该是可能的,但由于短语可以翻译成多种语言,因此最好是多对多关系。我走在正确的轨道上吗?translationOf
Set<Phrase>
Phrase?
0赞
Tom Harrington
7/19/2022
这取决于关系是多对一还是多对多。这是您根据您认为将如何使用数据来决定的。
评论