我需要一些关于设计我的核心数据模型的建议。
我有 2 个实体,Person
和 Town
,我需要将它们与“标记关系”联系起来:谁可以去哪个城镇以及需要多长时间.
约束是:
- 不能从任何其他数据推断出一个人去一个城镇所花费的时间;
- 对于给定的人来说,要么一个城镇无法到达,要么需要 1 或 2 或 ... 或 11 小时才能到达那里;
- 有 6000 个城镇,没有城镇会被 build /破坏;
- 最初有 200,000 人,这个数字将以每天 10~100 人的速度增长;
- 每人可以去5~1000个城镇(平均100个左右)
我花了很多时间研究建模的最佳方法,到目前为止我找到了 3 种方法:
选项 1: 创建 11 个多对多关系(
r1
、r2
、...r11
)。personA.r3
是personA
可以在 3 小时内到达的Town
集合;而townB.r6
是可以在正好 6 小时内到达townB
的Person
的集合。选项 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 个以上的对象,但我真的不喜欢有那么多重复数据。
所以我的问题是:
我是否忽略了一个(或多个)其他选项?
哪个选项最适合我的情况,为什么?在决定走哪条路时,我应该主要考虑哪一个?
如果将来某个时间我需要稍微修改我的模型,哪个选项是最佳选择?
非常感谢您的见解!
最佳答案
根据提供的信息,您的选项 2 绝对是可行的方法。其他两个选项无法扩展且不灵活,以防万一发生变化。
根据经验,如果您不需要保留有关关系本身的任何信息,您可以使用简单的多对多关系。如果您需要此信息,就像您的情况一样,您可以使用这种“连接”表。
虽然你的关系完全正确,但让我建议不同的名称,这将使你的代码更具可读性 IMO:
Person (trips) <----->> (person) Trip (town) <<-------> (trips) Town
关于ios - 核心数据中两个实体之间的不同多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27433710/