Core Data中2个实体之间的不同多对多关系

时间:2014-12-11 22:34:58

标签: ios core-data

我需要一些关于设计核心数据模型的建议。

我有2个实体,PersonTown,我需要将这些实体与“标记关系”联系起来:谁可以去哪个城镇以及需要多长时间。

约束是:

  • 一个人去城镇所需的时间不能从任何其他数据中推断出来;
  • 对于某个人来说,无法进入城镇,或者需要1或2或......或11个小时去那里;
  • 有6000个城镇,任何城镇都不会被建造/毁坏;
  • 最初有20万人,这个数字每天会增加10~100;
  • 每个人可以去5~1,000个城镇(平均而言,100个)

我花了很多时间研究建模的最佳方法,到目前为止我找到了3种方法:

  • 选项1:创建11个多对多关系(r1r2,... r11)。 personA.r3是一组TownpersonA可以在3小时内完成;而townB.r6Person的一组,他们可以在6小时内前往townB

  • 选项2:创建中间表(DurationInfo

  • 选项3:duration实体中添加Town属性,每个城镇由11个Town个对象表示(每个可能一个)持续时间)

Graph representations of the 3 options

根据我,以下是优点和缺点:

  • 选项1最初只有206,000个对象,它是最紧凑的(它是我实际尝试过的唯一一个,sqlite文件达到100 MB而且我真的不愿意远远超过那个... )

  • 选项1看起来很乱:我读到核心数据中并不真正推荐多对多关系,因此有11个......

  • 选项2似乎是“标记关系”的推荐解决方案,但在我的情况下,有20,000,000个DurationInfo个对象(并且每天将增加1,000~10,000个),多少空间采取?

  • 选项3“仅”创建了60,000多个对象,但我真的不想拥有那么多重复数据。

所以我的问题是:

  1. 我忽略了一个(或多个)其他选项吗?

  2. 哪种选择在我的情况下是最佳的,为什么?在决定走哪条路时,哪个应该是我的主要关注点?

  3. 如果将来需要稍微修改一下我的模型,哪个选项最佳?

  4. 提前感谢您的见解!

1 个答案:

答案 0 :(得分:1)

根据提供的信息,您的选项2绝对是您的选择。其他两个选项不会扩展,并且在某些内容发生变化时不灵活。

根据经验,如果您不需要保留关于关系本身的任何信息,您可以使用简单的多对多关系。如果您需要此信息,就像您的情况一样,您可以使用这种“连接”表。

虽然你的关系完全正确,但我建议使用不同的名称来使你的代码更具可读性IMO:

Person (trips) <----->> (person) Trip (town) <<-------> (trips) Town