【问题标题】:Why does an entity need an inverse?为什么实体需要逆?
【发布时间】:2011-12-08 10:21:14
【问题描述】:

我有一个非常简单的核心数据模型,由一个包含多个图像的画廊组成。在我看来,Gallery 与 Image 建立一对多关系就足够了,但如果我不建立从 Image 返回到 Gallery 的反向关系,我会收到编译器警告和错误。从面向对象的角度来看,在我看来,图像不应该知道或关心它是否在画廊或任何其他 ManagedObject 中,那么为什么编译器强迫我创建这种反向关系?在图像上设置“画廊”属性似乎非常错误。

【问题讨论】:

    标签: ios core-data entity entity-relationship


    【解决方案1】:

    Core Data 使用反向关系来帮助维护参照完整性。当您更改关系或删除对象时,它会显着提高性能。如果没有相反的操作,这些相同的操作可能会导致全表扫描。

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

    想象一下没有它们的多实体级联删除。可能需要足够长的时间,操作系统才会认为您的应用已崩溃。

    【讨论】:

    • 他们总是这么说。 “参照完整性。”这对我来说没有意义。如果一个实体有一个逆,那么我可以看到它需要如何声明。但是,如果在 OP 的情况下,图像没有引用图库,则如果删除图库或从图库中删除图像等,则不需要更改图像上的任何内容。
    • 我认为你是对的,它更多地与性能有关。如果是这样的话,为什么 Core Data 不能想出一个自动的幕后逆向呢?还是在某些情况下无法自动推断出逆应该是什么?
    • 谢谢。我不能假装理解你的答案,因为我对这个领域没有很好的了解,但如果它的性能明显更高,我想这是一个足够好的理由。然而,彻底打破封装似乎是一个令人震惊的代价。在由 User:Galleries:Gallery:Image 组成的对象图中,Image 可以获得对 User 的引用,这是完全错误的。
    【解决方案2】:

    我认为您不能将 oo 原则应用于数据库结构 - 它们不在同一个域中。核心数据是关于表和行以及它们之间的指针。让我们看看参照完整性和您的图库示例。如果您没有从图像到图库的关系,则当您删除图像时,系统将不知道要删除其在图库中的引用。你可能会争辩说应该注意这种细节,但我认为你就是这样,你应该忍受它。也许向 Apple 发送错误报告..

    【讨论】:

    • 是的。我认为问题在于托管对象是对象,但它们仍然受数据库结构规则的约束。我不应该关心反向引用。这是应该在幕后处理的细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2012-11-06
    • 2019-04-13
    • 2016-09-28
    • 1970-01-01
    相关资源
    最近更新 更多