ios - 核心数据中两个实体之间的不同多对多关系

标签 ios core-data

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

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

约束是:

  • 不能从任何其他数据推断出一个人去一个城镇所花费的时间;
  • 对于给定的人来说,要么一个城镇无法到达,要么需要 1 或 2 或 ... 或 11 小时才能到达那里;
  • 有 6000 个城镇,没有城镇会被 build /破坏;
  • 最初有 200,000 人,这个数字将以每天 10~100 人的速度增长;
  • 每人可以去5~1000个城镇(平均100个左右)

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

  • 选项 1: 创建 11 个多对多关系(r1r2、... r11 )。 personA.r3personA 可以在 3 小时内到达的 Town 集合;而 townB.r6 是可以在正好 6 小时内到达 townBPerson 的集合。

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

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

Graph representations of the 3 options

在我看来,以下是优点和缺点:

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

  • 选项 1 看起来很乱:我读到在 Core Data 中并不真正推荐多对多关系,所以有 11 个...

  • 选项 2 似乎是“标记关系”的推荐解决方案,但在我的例子中有 20,000,000 个 DurationInfo 对象(并且每天会增长 1,000~10,000 个),如何这需要多少空间?

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

所以我的问题是:

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

  2. 哪个选项最适合我的情况,为什么?在决定走哪条路时,我应该主要考虑哪一个?

  3. 如果将来某个时间我需要稍微修改我的模型,哪个选项是最佳选择?

非常感谢您的见解!

最佳答案

根据提供的信息,您的选项 2 绝对是可行的方法。其他两个选项无法扩展且不灵活,以防万一发生变化。

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

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

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

关于ios - 核心数据中两个实体之间的不同多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433710/

相关文章:

ios - 如何在 TableView 中保存数据?

core-data - 如何保留临时 NSManagedObjectContext 而不将其保存到父上下文

ios - xcode 7 不在模拟器的解析 TableView 中显示数据,但在设备中有效

ios - 合并几个物理体

iphone - 初始化 iPhone 应用程序核心数据的最佳方法?

ios - 逆向工程 Core Data db 导致 "Can' t find model for source store”错误

cocoa - 通过绑定(bind)和值转换器在 View (NSTableColumn)中显示一对多关系

iOS - UILabel 加载,但没有显示文本

ios - 弃用开源库中的警告?

ios - Core Text - 字形高度