是否可以建立自引用的一对多核心数据关系?

Is a self referential one-to-many Core Data relationship possible?

提问人:Shawn Throop 提问时间:7/18/2022 最后编辑:ShadowShawn Throop 更新时间:7/19/2022 访问量:105

问:

我正在学习使用核心数据,并且对数据建模有一些想法。作为一个试图学习德语的人,我正在制作一本短语日志和它们周围的一些上下文,例如文本的语言、注释和可能的翻译。

第一个想法

这是一个非常简化的模型:

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?
}

结论

我觉得我可能想错了问题。这种结构有更好的模型吗?

swift objective-c 连接 core-data

评论

2赞 Joakim Danielson 7/19/2022
是的,Core Data 中的实体可以与自身建立关系。

答:

1赞 Tom Harrington 7/19/2022 #1

这两种方法都可以使用,但重要的是要了解核心数据与关系数据库的不同之处。在这两种情况下,Core Data 都会抱怨没有反比关系。它希望在两端都有关系的属性。在第一种情况下,它会期待你可能会调用的第二种关系或其他东西。您永远不需要使用这种关系,但最好将其用于 Core Data 的内部使用。translatedFrom

除此之外,您还可以使用任何一种方法。第二种方法的优点是,您可以分别从每个短语中添加有关翻译的注释或其他数据。但是,如果您不需要它,请不要为第二个实体而烦恼。

评论

0赞 Shawn Throop 7/19/2022
感谢您的见解。对于我的第一个想法,我将尝试添加一个属性,但我不确定这应该是一个还是只是一个.我觉得两者都应该是可能的,但由于短语可以翻译成多种语言,因此最好是多对多关系。我走在正确的轨道上吗?translationOfSet<Phrase>Phrase?
0赞 Tom Harrington 7/19/2022
这取决于关系是多对一还是多对多。这是您根据您认为将如何使用数据来决定的。