2011-04-06 100 views
1

Apple的文档建议在CoreData中对数据模型建模时使用反向关系。CoreData建模逆关系

我下面举个例子:

一本书(实体)有几个“页”和一个“frontCover”和一个“后盖”。 页面(实体)在一个“书”(所以“书”是“页”的反面)。

OK,到目前为止,这是标准的情况下......但现在,我的问题:

我只有一类封面(实体)。封面(实体)在一本“书”上。在这本“书”封面是“frontCover”或“backCover”。所以,“book”的倒数是“frontCover”还是“backCover”。

这不能在CoreData中建模。一种关系只能是一种关系的逆转,而不能取决于这种或那种关系。

建模的最佳方式是什么?单向关系(无向)?

谢谢您的回答, 克里斯

回答

2

你可以做类似下面的模型(第一图片)。这将使Cover的反向关系为零。不过,这对我来说并不合适。

另一种选择(第二个图像)是给Book一个引用2个Cover对象的'封面'关系,并给Cover一个isFront布尔属性。这将允许称为“书”的反向关系。

enter image description here

enter image description here

+0

嗯......我不知何故喜欢第二种选择。然而,所有书籍的所有封面的显示将更加困难(可以在第一种情况下的一次操作中完成)。此外,我必须确保Book.covers有2个且只有2个封面,其中只有一个是封面。 ....选项1确实感觉有点奇怪,但实际上是做我想要的...也许我会选择这个选项...或者我会坚持从书到封面的单向关系。 – naeger 2011-04-12 18:05:41

2

一种方式做到这一点可能是建立封面与两个子实体的“抽象”实体 - FrontCover &后盖。然后你可以创建与其中每一个相反的关系&。

+0

+1优雅的解决方案 – westsider 2011-04-08 16:02:27

+0

是的,总的来说我同意。通常,FrontCover和BackCover之间至少有一些区别,所以这将是两个子类的理由。然而,在我的特殊情况下(书和封面只是一个修剪下来的玩具的例子),封面和封底之间绝对没有区别。更糟糕的是,在某些情况下,封面可能会变成封底,反之亦然。所以这将在我的特例中反对这个解决方案... – naeger 2011-04-12 17:54:26

+0

但是,无论如何感谢这个答案! – naeger 2011-04-12 17:55:05

0

我只想补充。

一种方法是有2个子实体。但是这只有在FrontCover和BackCover差别很大时才有用。

如果它们是完全相同的对象,则应改为在实体中使用枚举。

该枚举区分封面是frontCover还是BackCover。

然后,您从书中设置了1到多个关系。

coredata的目的是保存您的数据。无论如何,你的逻辑应该在代码中。

另外创建两个子实体与westSider的答案基本相同。子实体只是在原始实体上添加另一个关系。