如何在Core Data中建模两对多关系?

时间:2015-03-19 14:35:08

标签: ios core-data

我正在使用包含航班,乘客和服务请求的商业模式。

航班有乘客。乘客有零到多个服务请求。

我需要显示一个视图,显示所有在航班上有服务请求的乘客,按服务请求类型分组。乘客将在他们有服务请求的每个组中出现一次。

视图的数据需要来自Core Data。

我的问题是如何以一种方式对Core Data中的关系进行建模,以便有效地为我的视图检索数据,以及如何编写有效的获取请求。

我正在创建像这样的核心数据实体:

飞行---对很多人来说--->乘客---到很多--->服务请求

但我想知道这是否有效。一个不同的(非规范化)模型会更有意义吗?

飞行---对很多人来说--->服务请求

每个服务请求都包含乘客姓名。感谢您提供任何建议。

3 个答案:

答案 0 :(得分:0)

我认为使用非规范化模型检索数据会有更好的表现。

您可以使用谓词来决定是否在服务请求(包括乘客姓名)列表中添加新对象。

答案 1 :(得分:0)

首先澄清FlightsPassengers之间的关系:Flight有很多Passengers,但Passenger可能会有很多Flights Journey 1}?如果这种关系确实很多,那么我认为你应该添加一个中间实体(例如Flight <---->> Journey <<----> Passenger ):

Journey <---->> ServiceRequest

每个旅程代表单个航班上的单个乘客(实际上可能有一些属性,例如SeatNumber)。然后,ServiceRequest将与单个Journey相关,但单个Journey可能会有许多ServiceRequests:

NSFetchedResultsController

如果您打算使用ServiceRequest来构建表格视图,那么您可以使用ServiceRequest.Journey.Flight作为获取的实体,并使用基于ServiceRequestType的谓词来过滤使用sectionNameKeyPath作为ServiceRequest.Journey.Passenger对特定航班的结果进行分组。然后,您必须使用{{1}}来访问乘客的详细信息以供显示。遍历这些关系以获取Flight和Passenger细节会有一些开销,但您可以使用预取来最小化影响。

关于您的第二个选择,您如何为没有服务请求的乘客建模?

答案 2 :(得分:0)

根据我的经验,我认为这些模型在性能问题上是平等的。 由于在两种情况下将与航班相连的数据量相对相等。

模型1:

  • min passenger = 0(空旷的飞行)
  • 最大乘客=最大飞机容量 (让它成为2000年)

模型0

  • min services request = 0(贪婪的人)
  • 最大服务请求= 乘客x 2(幸运航班)

如果您有疑问,可以将第二个模型的关系添加到第一个模型

Flight ---to many---> Passenger ---to many---> Service Request --to one-> Flight