减少核心数据中的关系数

时间:2018-11-17 20:20:07

标签: ios core-data relationship data-modeling

我的应用程序随附在Core Data中创建的广泛数据模型。随着模型的增长,我发现我正在创建大量的可选关系,它看起来比我想象的要混乱和膨胀。 是否存在减少关系数量的适当方法?

通常,众多关系的主要驱动因素是,我有许多实体需要一些特定的属性,具体取决于实体的形态。我画了一个假设的例子来创建一些上下文。想象在应用程序中用户可以创建动物。每只动物都有一些一般的属性,但是根据我们要处理的动物,也有许多特定的属性。 我当前的方法将导致一个模型,其中动物实体与指定的属性实体具有多个一对一的关系,如下所示。

enter image description here

但是,很显然,当您要扩展此模型时,关系数量很容易失控。另外,没有什么可以阻止当前动物错误地被分配多个指定的财产实体。 我正在考虑切换到另一种方法,即删除核心数据关系并使用UID将具有以下特定属性的动物进行匹配。动物实体获得一个“ specifiedProps”属性,在该属性中,我存储了一个UID,该UID链接到每个都具有UID属性的specificProperty实体之一。

enter image description here

据我所知,它具有以下缺点和好处

缺点:

  • 这需要一些通常由核心数据处理的开销(例如级联删除),
  • 获取会慢一些,但是每只动物只需要获取一个指定的属性实体,所以我认为这不应该成为问题。

好处:

  • 减少应用程序中越来越多的可选关系,并随着用户创建越来越多的动物而节省存储空间。
  • 一种动物显然只有一种引人注目的特性。
  • 更容易迁移;在引入新动物时,不必创建任何关系,而只需创建一个新实体。

我的问题是我是否忽略了某些内容?是我犯了一个可怕的错误,还是有更好的选择?

任何评论评论将不胜感激。

Ps。我知道核心数据允许使用父级/子级实体,但据我所知,在其后面有一个sqlite商店的情况下,每种动物的指定实体的每个属性都将最终存储在一个表中。考虑到我的情况,每只动物都有一系列特定的特性,这似乎是非常不可取的,在将来,动物的数量也应允许增加到很多。

1 个答案:

答案 0 :(得分:0)

这是我到目前为止所采取的方法,以防万一它对任何人都有帮助(随意批评)。

我按照@pbasdf的建议创建了一个通用属性实体。转换成动物类比后,模型就这样出来了。

enter image description here

每只动物与属性都有一对多的关系(“属性”)。属性同时包含类型(Int16)和值(二进制数据)。根据类型,将二进制值转换为Float,String,UIColor或任何与属性类型匹配的数据类型。

最初,我将value定义为String,但是在切换过程中,我注意到性能显着下降。在原始模型中,属性是专门定义的。因此,可以直接访问它们并以正确的类型提供它们。但是,对于新设置,需要两个额外的步骤。 1)根据类型,我们必须首先找到正确的属性。通常情况下,动物的数量少于10只,但平均而言,这仍然意味着必须对几对动物进行评估,然后才能找到正确的动物。 2)从通用值转换为正确的数据类型也会增加时间。使用字符串(10+)时,这两个步骤导致属性获取时间大大增加。通过使用二进制属性存储值,增加限制为3-4倍。当然,如果您需要搜索该值,则如pbasdf所述,更易于访问字符串。

最后,我遇到的问题是Animal实体仍然属于多个容器,这意味着大量传入关系使模型混乱。不幸的是,在我的模型中,我没有处理动物,也不能仅仅将Jungle,Zoo和WildLifePreserve转换为通用的Enclosure实体。 Rather Animal是一个通用属性容器,可为整个不同实体提供属性。