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

Data model for enum with associated values

我试图弄清楚在 Core Data 数据模型中使用关联值实现枚举的推荐方法是什么。假设我有一个书籍实体,我想在数据库中保存我是如何得到这本书的,比如:

这将是 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)
}

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

见图:

我想知道这样做是否正确,我有几个具体问题。

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

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

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

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

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

假设我在 运行 次修改 book.whereItCameFrom 关系值。它的先前值是一个 Borrowed 对象。它的新值是一个 GivenAsGift 对象。我是否需要手动删除 Borrowed 对象(我的意思是,在应用程序代码中明确地这样做)?

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

感谢您的帮助。

更新:

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

一些想法...

1) What's the typical way to implement enum with associated values?

I think my above modal is good. But just in case, are there other better ways to do it?

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

2) Is entity with no attributes normal?

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

3) Will the old object be removed automatically when modifying relationship at run time?

没有。如果您在 运行 时修改 book.whereItCameFrom 关系值,用 GivenAsGift 对象替换 Borrowed 对象,CD 的图管理将确保 Borrowed 对象的 book 属性 设置为零。级联规则不会阻止对象以这种方式 "orphaned",您必须手动删除 Borrowed 对象。