【发布时间】:2011-07-21 13:09:55
【问题描述】:
我有一个相当简单的 CoreData 模型,表示为:
有许多“旅行”可以包含多张图片。此外,单个图像可以在多个行程中。
我的问题是我想保持将它们添加到旅行的顺序。通常,我会向ImageData 对象添加一个字段,以维护其index。但是,因为图像可以在任意数量的行程中,所以这没有意义。
在这种情况下维护索引的干净方法是什么?
【问题讨论】:
我有一个相当简单的 CoreData 模型,表示为:
有许多“旅行”可以包含多张图片。此外,单个图像可以在多个行程中。
我的问题是我想保持将它们添加到旅行的顺序。通常,我会向ImageData 对象添加一个字段,以维护其index。但是,因为图像可以在任意数量的行程中,所以这没有意义。
在这种情况下维护索引的干净方法是什么?
【问题讨论】:
您在 Xcode 4 中寻找有序关系复选框。
维护关系的顺序会带来性能成本,因此如果您的数据集很大(>10k 个对象),您可能需要考虑传统的排序属性 + 排序描述符方法。
对于您的具体情况,您可能最终会得到一个中间连接实体,它是 Image 和 Trip 之间的连接,即 ImageTripOrder,并且与 Trip 一对一以及与 Image 一对一.
【讨论】:
处理此问题的旧方法是提供一个对订单进行编码的链接实体。
Trip{
//...various attributes
images<-->>TripToImage.trip
}
Image{
//...various attributes
trips<-->>TripToImage.image
}
TripToImage{
trip<<-->Trip.images
image<<-->Image.trips
previous<-->TripToImage.next
next<-->TripToImage.previous
}
链接实体正在扩展关系的建模。您可以创建行程或图像的任意顺序。
但是,通过更好的模型设计,通常可以使这种排序变得多余。在这种情况下,如果图像具有特定的日期和位置,它们如何成为不止一次旅行的一部分?你在做一个时间旅行机构的模特吗? ;-)
Core Data 应该模拟/建模您的应用处理的真实世界对象、事件和条件。真实世界的图像和旅行具有在空间和时间上唯一描述它们的属性。如果您的实体准确地捕获了所有这些数据,那么根据属性对它们进行排序就变得微不足道了。
通常,当您必须对任意顺序(例如用户最喜欢的排名或其他主观排序)进行建模时,您才需要使用链接实体。
它会拍摄您想去的地方的图片并将它们放在一个列表中 去旅行。 IE。不是您亲自拍摄的图像。
您当前的模型很麻烦,因为您对问题的建模不够紧密。
您实际上是在创建一个包含一系列位置和时间的行程,但是您试图通过将Trip 和Image 对象以一种复杂的关系组合在一起来间接地对这些信息进行建模。
相反,您需要一个专门为行程建模的实体。
ItineraryStop{
name:string
arrivalTime:date
departureTime:date
location<<-->Location.stops
image<<-->Image.stop
trip<<-->Trip.stop
previousStop<-->IteneraryStop.nextStop
nextStop<-->InteneraryStop.previousStop
}
现在,一切都已经到位。要为特定行程获取所有停靠点,您可以在行程中获取并按到达时间排序,您可以对任何特定的 Trip 对象停靠点进行排序,或者如果没有日期,您可以遍历关系。
无论如何,您的模型现在更接近于您的应用处理的真实世界对象、事件或条件。
【讨论】:
Image 对象或Trip 对象开始,然后您会自动拥有一组关联的TripToImage 对象。我通常在排序对象中有一个方法,告诉他们只需通过从随机排序对象开始的上一条/下一条路径来找到头部或尾部。这适用于几十个对象。