2011-10-15 36 views
2

我有一个非常简单的核心数据模型,包含一个包含多个图像的图库。在我看来,画廊与图像具有一对多关系就足够了,但是如果我也不建立从图像到图库的反向关系,则会出现编译器警告和错误。从面向对象的角度来看,在我看来,Image不应该知道或关心它是否在Gallery或任何其他ManagedObject中,那么为什么编译器会迫使我创建这种反向关系?在图片上拥有“图库”属性似乎非常错误。为什么一个实体需要一个逆?

回答

8

核心数据使用反比关系来帮助保持参照完整性。当你改变一个关系或删除一个对象时,它会显着提高性能。如果没有相反的情况,那些相同的操作可能会导致全表扫描。

在我看来,没有反转应该是一个错误,而不是一个警告。在一些相当常见的情况下,这种差别可能会很大。

想象一下没有它们的多实体级联删除。可能花费足够的时间,操作系统认为你的应用程序崩溃了。

+0

这就是他们总是说。 “参照完整性。”这对我来说没有意义。如果一个实体有一个逆,那么我可以看到它是如何声明的。但是,如果在OP的情况下,图像没有对图库的引用,如果图库被删除,或图像从图库中删除等,图像上的任何内容都不需要改变。 – morningstar

+0

我认为你是对的,它更多与性能有关。如果是这样的话,为什么Core Data不能提供一个自动幕后逆转?或者是否有一些情况不可能自动推断出什么是倒数? – morningstar

+0

谢谢。我不能假装理解你的答案,因为我对这个领域没有很好的了解,但是如果它具有更高的性能,我认为这是一个足够好的理由。然而彻底破坏封装似乎是一个可怕的代价。在由User:Galleries:Gallery:Image构成的对象图中,Image可以获得对User的引用,这只是错误的。 – Undistraction

0

我认为你不能将oo原则应用于数据库结构 - 它们不在同一个域中。核心数据是关于表和行以及它们之间的指针。让我们看看参照完整性和您的画廊的例子。如果您没有图片与图库的关系,则当您删除图像时,系统将不知道删除图库中的参考。你可能会认为这种细节应该被照顾,但我认为你是这样的,你应该只是忍受它。也许发送一个错误报告给苹果公司..

+0

是的。我认为问题在于受管对象是对象,但它们仍受数据库结构规则的约束。我不应该关心反向引用。这是应该在幕后处理的细节。 – Undistraction

相关问题