具有关联值的枚举的数据模型
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)
}
我正在考虑使用继承在数据模型中实现它,如下所示:
引入一个父实体WhereItCameFrom
并将上述案例定义为其子实体
定义从 Book
到 WhereItCameFrom
的 to-one
关系。它的删除规则是Cascade
.
定义从 WhereItCameFrom
到 Book
的 to-one
关系。它的删除规则是Deny
.
见图:
我想知道这样做是否正确,我有几个具体问题。
1) 使用关联值实现枚举的典型方法是什么?
我觉得我上面的模态很好。但为了以防万一,还有其他更好的方法吗?
2)没有属性的实体是否正常?
在上图中,WhereItCameFrom
没有任何属性。起初我向它添加了一个 type
属性以指示它是 Bought
、Borrowed
还是 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?
这很不寻常,但不是问题。但是,由于所有三个子实体都具有 date
和 who
属性,因此将这些从子实体移动到父 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
对象。
我试图弄清楚在 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)
}
我正在考虑使用继承在数据模型中实现它,如下所示:
引入一个父实体
WhereItCameFrom
并将上述案例定义为其子实体定义从
Book
到WhereItCameFrom
的to-one
关系。它的删除规则是Cascade
.定义从
WhereItCameFrom
到Book
的to-one
关系。它的删除规则是Deny
.
见图:
我想知道这样做是否正确,我有几个具体问题。
1) 使用关联值实现枚举的典型方法是什么?
我觉得我上面的模态很好。但为了以防万一,还有其他更好的方法吗?
2)没有属性的实体是否正常?
在上图中,WhereItCameFrom
没有任何属性。起初我向它添加了一个 type
属性以指示它是 Bought
、Borrowed
还是 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?
这很不寻常,但不是问题。但是,由于所有三个子实体都具有 date
和 who
属性,因此将这些从子实体移动到父 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
对象。