gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:11:45 25 4
gpt4 key购买 nike

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

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

这将是一个 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,并将上述案例定义为其子实体。

  • 定义从 BookWhereItCameFrom对一关系。其删除规则为Cascade

  • 定义从 WhereItCameFromBook对一关系。其删除规则为拒绝

看图:

enter image description here

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

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

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

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

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

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?

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

2) Is entity with no attributes normal?

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

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

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

关于ios - 具有关联值的枚举的数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59622424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com