我需要一些关于设计核心数据模型的建议。
我有2个实体,Person
和Town
,我需要将这些实体与“标记关系”联系起来:谁可以去哪个城镇以及需要多长时间。
约束是:
我花了很多时间研究建模的最佳方法,到目前为止我找到了3种方法:
选项1:创建11个多对多关系(r1
,r2
,... r11
)。 personA.r3
是一组Town
,personA
可以在3小时内完成;而townB.r6
是Person
的一组,他们可以在6小时内前往townB
。
选项2:创建中间表(DurationInfo
)
选项3:在duration
实体中添加Town
属性,每个城镇由11个Town
个对象表示(每个可能一个)持续时间)
根据我,以下是优点和缺点:
选项1最初只有206,000个对象,它是最紧凑的(它是我实际尝试过的唯一一个,sqlite文件达到100 MB而且我真的不愿意远远超过那个... )
选项1看起来很乱:我读到核心数据中并不真正推荐多对多关系,因此有11个......
选项2似乎是“标记关系”的推荐解决方案,但在我的情况下,有20,000,000个DurationInfo
个对象(并且每天将增加1,000~10,000个),多少空间采取?
选项3“仅”创建了60,000多个对象,但我真的不想拥有那么多重复数据。
所以我的问题是:
我忽略了一个(或多个)其他选项吗?
哪种选择在我的情况下是最佳的,为什么?在决定走哪条路时,哪个应该是我的主要关注点?
如果将来需要稍微修改一下我的模型,哪个选项最佳?
提前感谢您的见解!
答案 0 :(得分:1)
根据提供的信息,您的选项2绝对是您的选择。其他两个选项不会扩展,并且在某些内容发生变化时不灵活。
根据经验,如果您不需要保留关于关系本身的任何信息,您可以使用简单的多对多关系。如果您需要此信息,就像您的情况一样,您可以使用这种“连接”表。
虽然你的关系完全正确,但我建议使用不同的名称来使你的代码更具可读性IMO:
Person (trips) <----->> (person) Trip (town) <<-------> (trips) Town