【问题标题】:Core Data ordered many-to-many relationshipsCore Data 排序多对多关系
【发布时间】:2016-04-07 10:51:49
【问题描述】:

使用 Core Data,我有两个具有多对多关系的实体。所以:

Class A <<---->> Class B

这两种关系都设置为“有序”,因此我可以在 UITableView 中跟踪它们的顺序。效果很好,没问题。

我即将尝试用这个 Core Data 模型实现 iCloud,发现 iCloud 不支持有序关系,所以我需要以某种方式重新实现排序。

我已经对另一个具有一对多关系的实体进行了此操作,没有问题,我向实体添加了一个“订单”属性并将其订单信息存储在那里。但是对于多对多关系,我需要未知数量的订单属性。

我可以想到两种解决方案,但对我来说似乎都不理想,所以也许我遗漏了一些东西;

选项 1。我添加一个中间实体。该实体与两个实体具有一对多的关系,如下所示:

Class A <<--> Class C <-->> Class B

这意味着我可以在这个辅助实体中拥有单个 order 属性。

选项 2。我不是存储单个订单号的订单属性,而是存储一个字典,我可以存储我需要的任意数量的订单号,可能使用相应的对象(ID?)作为键和订单号作为值。

我不一定要寻找任何代码,因此任何想法或建议都将不胜感激。

【问题讨论】:

  • iCloud 同步的最佳方式...ensembles.io
  • 那些对多的箭头不会被翻转吗?似乎每个排序实体都有一个对 A 类实例的引用和一个对 B 类实例的引用。那么 A 和 B 实体将有许多排序参考..

标签: objective-c core-data entity-relationship


【解决方案1】:

我认为您的选项 1,使用带有 order 属性的“连接表”是解决此问题的最可行的解决方案。事实上,这在过去已经做过很多次了。这正是您在 Core Data 中使用连接表的情况,尽管框架已经为您提供了多对多关系:如果您想存储有关关系本身的信息,这正是你的情况。通常这些是时间戳,在您的情况下它是一个序列号。

您说:“……解决方案,我觉得这两种解决方案都不理想”。对我来说,以上似乎确实“理想”。我反复使用过这个方案,性能和可维护性都很好。

唯一的问题(尽管它与一对一关系相同)是当插入一个不按顺序的项目时,您必须更新许多实体才能获得正确的顺序。这看起来很麻烦,并且可能会损害性能。然而,在实践中,它非常易于管理并且性能相当好。


注意:至于要与实体一起存储以跟踪排序信息的数组或字典:这可以通过所谓的“可转换”属性实现,但开销令人生畏。这些属性必须被序列化和反序列化,并且为了检索一个序列号,您必须获得所有它们。几乎不是一个有吸引力的设计选择。

【讨论】:

  • 我同意,对数据进行序列化使其有点不可取。如果 CD 支持开箱即用的字典,它可能是一种选择,但使用连接实体非常有意义。不知道为什么我一开始就反对它
  • 此外,您将无法使用字典进行搜索或过滤。我确信这是设计使然不支持的。
【解决方案2】:

在 10 多年的时间里,在我们有序关系之前,每个人都使用“助手”实体。所以这是你应该做的事情。

附加说明 1:这不是“帮助”实体。它是在您的模型中对事实进行建模的实体。在我的书中,我总是有同样的例子:

您有一个包含成员的组实体。每个成员都可以属于许多组。 “帮助者”实体只不过是会员资格。

补充说明2:这样的有序关系很难同步。这就是为什么它不会自动完成。但是,您必须这样做。由于 CD 和同步没有乐趣,CD 和同步具有有序关系的模型也不是没有乐趣。

【讨论】:

  • 您有权认为它不是真正的辅助实体并且在模型中非常有意义。你说同步有序的 cd 关系很难,仅仅是因为(正如@Mundi 所说)更新订单意味着只为一个订单更改更改许多对象的订单属性,还是还有更多?
  • 问题是很难知道正确的顺序是什么。请记住,设备可能在不知道其他设备更改数据的情况下更改了数据。自然秩序更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多