具有关联值的枚举的数据模型

ray*_*ayx 5 enums core-data relationship ios

我试图找出在核心数据数据模型中实现具有关联值的枚举的推荐方法。假设我有一本图书实体,我想将我获取这本书的方式保存在数据库中,例如:

  • 它是我(或其他家庭成员)购买的
  • 它是从某人(例如同事)那里借来的
  • 它是由某人(例如朋友)作为礼物赠送的

这将是一个 swift 枚举:

enum WhereItCameFrom {
    case Bought(who: String, date: Date, where: String)
    case Borrorwed(who: String, date: Date, dueDate: Date)
    case GivenAsGift(who: String, date: Date, forWhat: String)
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用继承在数据模型中实现它,如下所示:

  • 引入一个父实体WhereItCameFrom,并将上述案例定义为其子实体。

  • 定义to-oneBook到 的关系WhereItCameFrom。其删除规则为Cascade

  • 定义to-oneWhereItCameFrom到 的关系Book。其删除规则为Deny

看图:

在此输入图像描述

我想知道这是否是正确的方法,并且我有一些具体问题。

1)实现具有关联值的枚举的典型方法是什么?

我认为我上面的模式很好。但以防万一,还有其他更好的方法吗?

2)没有属性的实体正常吗?

在上图中,WhereItCameFrom没有任何属性。首先,我type向它添加了一个属性来指示它是否是BoughtBorrowed、 或GivenAsGift实体。但后来我意识到这个信息隐含在它的子实体类类型中,所以我删除了它。因此,父实体的唯一目的是保持关系。这种用法在核心数据中是典型的吗?

3)运行时修改关系时旧对象会自动删除吗?

book.whereItCameFrom假设我在运行时修改关系值。它以前的值是一个Borrowed对象。它的新值是一个GivenAsGift对象。我是否需要Borrowed手动删除该对象(我的意思是,在应用程序代码中明确执行此操作)?

我想我应该这么做。但鉴于 Core Data 是一个有助于维护对象图中数据一致性的框架,这对我来说似乎很尴尬。我想知道Core Data是否有一些功能可以判断Borrowed不需要的对象并自动删除它?

谢谢你的帮助。

更新:

第三个问题,旧Borrowed对象与对象断开连接后Book,我的理解是否正确,从Borrowed对象角度来看,对等对象已被删除,因此对等对象的Cascade删除规则适用于该Borrowed对象?如果是这样,它将被自动删除。我认为这里真正的问题是删除规则是否适用于关系更新。今天晚些时候我将对此做一些实验。

pba*_*sdf 0

一些想法...

1)实现具有关联值的枚举的典型方法是什么?

我认为我上面的模式很好。但以防万一,还有其他更好的方法吗?

我无法评论实现具有关联值的枚举的典型方法,但您的模型似乎很有意义。需要注意的是:如果您在 StackOverflow 中搜索有关实体继承的问题,您会发现一些建议不要使用它的答案。CD 实现子实体的方式(至少对于 SQLite 存储)是将所有子实体的所有属性添加到父实体 SQLite 表中。这是由 CoreData 在“幕后”为您处理的,但 SQLite 表最终可能会变得非常“宽”,这可能会影响性能。我从来没有发现它是一个问题,但如果您有大量数据和/或实体比您在问题中指出的更复杂,您可能需要记住这一点。在某些罕见的情况下,子实体也可能会导致问题 - 例如,我见过一些问题表明存在唯一性约束问题。

2)没有属性的实体正常吗?

这很不寻常,但不是问题。但是,由于所有三个子实体都具有datewho属性,因此明智的做法是将这些属性从子实体移至父WhereItComeFrom实体。(否则,如上所述,您的父实体表将具有三列 for date(每个子实体一列)和三列 for who)。

3)运行时修改关系时旧对象会自动删除吗?

book.whereItCameFrom不会。如果您在运行时修改关系值,用一个GivenAsGift对象替换另一个Borrowed对象,CD 的图形管理将确保该Borrowed对象的book属性设置为 nil。级联规则不会阻止对象以这种方式“孤立”,您必须手动删除该Borrowed对象。