核心数据模型——实体和逆
Core Data model - entities and inverses
我是 Core Data 的新手,我正在尝试将其实施到我现有的项目中。这是我的模型:
现在,有些事情对我来说没有意义,可能是因为我没有正确建模。
CMAJournal 是我的顶级对象,具有一组有序的 CMAEntry 对象和一组有序的 CMAUserDefine 对象。
这是我的问题:
每个 CMAUserDefine 对象都有一组有序的对象。例如,"Baits" CMAUserDefine 将具有一组有序的 CMABait 对象,"Species" CMAUserDefine 将具有一组有序的 CMASpecies 对象等。
每个 CMAEntry 对象都具有 baitUsed、fishSpecies 等指向相应 CMAUserDefine 对象中的对象的属性。如果进行了更改,那么引用该对象的每个 CMAEntry 也会更改。
现在,从我读到的内容来看,我应该对我的每段关系都有逆向。这在我的模型中没有意义。例如,我可以有 5 个 CMAEntry 对象,它们的 baitUsed 属性 指向同一个 CMABait 对象。如果有 5 个 CMAEntry 对象引用该 CMABait,则 CMABait 的条目 属性 指向哪个 CMAEntry?我不认为它应该指向任何东西。
我想要的是将所有 CMAUserDefine 对象(即所有 CMABait、CMASpecies、CMALocation 等对象)存储在 CMAJournal userDefines 集中,并在每个 CMAEntry 中引用这些对象。
我最初使用 NSArchiving 时效果很好,但存档文件非常大。我的意思是,16 个左右的条目(包括大约 20 张图像)需要 18+ MB。从我读到的内容来看,Core Data 是我无论如何都应该学习的东西。
所以我想知道,我的模型是不是错了?我采取了错误的方法吗?有没有更有效的使用 NSArchiver 的方法更符合我的需要?
我希望这是有道理的。如果我需要更好地解释,请告诉我。
谢谢!
E:导致我提出这个问题的原因是在尝试保存时遇到一堆 "Dangling reference to an invalid object." = "" 错误。
一个。一些基础知识
Core Data 需要一个反向关系来为关系建模。长话短说:
在由 Core Data 建模的对象图中,引用在语义上从源对象指向目标对象。因此,您使用单个引用作为 CMASpecies
的 fishSpecies
来建模一对一关系,并使用集合作为 NSSet
来建模一对多关系。您不关心反向关系的类型。在许多情况下,您根本没有。
在关系数据库中,关系的建模方式不同:如果您有 1:N(一对多)关系,则该关系存储在目标端。这样做的原因是,在 rDB 中,每个实体都有固定的大小,因此不能引用可变数量的目的地。如果您有多对多关系 (N:M),则需要额外的 table。
如您所见,在对象图中,关系类型是一对一和一对多,仅取决于源,而在 rDB 中,关系类型是一对一,一对一许多,多对多取决于来源和目的地。
要select对rDB建模的那种 Core Data想知道逆向关系的类型。
Type Object graph Inverse | rDB
1:1 to-one id to-one id | source or destination attribute
1:N collection to-one id | destination attribute
N:M collection collection | additional table with two attributes
乙。给你的Q
在你的例子中,如果一个 CMAEntry
对象恰好引用一个 CMASpecies
对象,但是一个 CMASpecies
对象可以被许多 CMAEntry
对象引用,这仅仅意味着反向关系是一对多关系。
是的,OOP 开发人员有这种相反的关系很奇怪。对于 SQL 开发人员来说,这是常见的情况。开发一个ORM(对象关系映射器)这是问题之一。 (我知道这一点,因为我现在正在为 Objective-Cloud 这样做。但如果不同,更多的是 OOP 的观点,我是这样做的。)每个解决方案对一方来说都是不同寻常的。有人称 ORM "vietnam of software development".
举一个更简单的例子:为体育联盟建模,您会发现自己有一个实体 Match
,其属性为 homeTeam
和 guestTeam
。您想要的是反向关系,不是 homeMatches
和 guestMatches
,而是 matches
。这显然不是倒数。如果 Core Data 想要并且不关心它,只需添加反向关系。
我是 Core Data 的新手,我正在尝试将其实施到我现有的项目中。这是我的模型:
现在,有些事情对我来说没有意义,可能是因为我没有正确建模。
CMAJournal 是我的顶级对象,具有一组有序的 CMAEntry 对象和一组有序的 CMAUserDefine 对象。
这是我的问题:
每个 CMAUserDefine 对象都有一组有序的对象。例如,"Baits" CMAUserDefine 将具有一组有序的 CMABait 对象,"Species" CMAUserDefine 将具有一组有序的 CMASpecies 对象等。
每个 CMAEntry 对象都具有 baitUsed、fishSpecies 等指向相应 CMAUserDefine 对象中的对象的属性。如果进行了更改,那么引用该对象的每个 CMAEntry 也会更改。
现在,从我读到的内容来看,我应该对我的每段关系都有逆向。这在我的模型中没有意义。例如,我可以有 5 个 CMAEntry 对象,它们的 baitUsed 属性 指向同一个 CMABait 对象。如果有 5 个 CMAEntry 对象引用该 CMABait,则 CMABait 的条目 属性 指向哪个 CMAEntry?我不认为它应该指向任何东西。
我想要的是将所有 CMAUserDefine 对象(即所有 CMABait、CMASpecies、CMALocation 等对象)存储在 CMAJournal userDefines 集中,并在每个 CMAEntry 中引用这些对象。
我最初使用 NSArchiving 时效果很好,但存档文件非常大。我的意思是,16 个左右的条目(包括大约 20 张图像)需要 18+ MB。从我读到的内容来看,Core Data 是我无论如何都应该学习的东西。
所以我想知道,我的模型是不是错了?我采取了错误的方法吗?有没有更有效的使用 NSArchiver 的方法更符合我的需要?
我希望这是有道理的。如果我需要更好地解释,请告诉我。
谢谢!
E:导致我提出这个问题的原因是在尝试保存时遇到一堆 "Dangling reference to an invalid object." = "" 错误。
一个。一些基础知识
Core Data 需要一个反向关系来为关系建模。长话短说:
在由 Core Data 建模的对象图中,引用在语义上从源对象指向目标对象。因此,您使用单个引用作为 CMASpecies
的 fishSpecies
来建模一对一关系,并使用集合作为 NSSet
来建模一对多关系。您不关心反向关系的类型。在许多情况下,您根本没有。
在关系数据库中,关系的建模方式不同:如果您有 1:N(一对多)关系,则该关系存储在目标端。这样做的原因是,在 rDB 中,每个实体都有固定的大小,因此不能引用可变数量的目的地。如果您有多对多关系 (N:M),则需要额外的 table。
如您所见,在对象图中,关系类型是一对一和一对多,仅取决于源,而在 rDB 中,关系类型是一对一,一对一许多,多对多取决于来源和目的地。
要select对rDB建模的那种 Core Data想知道逆向关系的类型。
Type Object graph Inverse | rDB
1:1 to-one id to-one id | source or destination attribute
1:N collection to-one id | destination attribute
N:M collection collection | additional table with two attributes
乙。给你的Q
在你的例子中,如果一个 CMAEntry
对象恰好引用一个 CMASpecies
对象,但是一个 CMASpecies
对象可以被许多 CMAEntry
对象引用,这仅仅意味着反向关系是一对多关系。
是的,OOP 开发人员有这种相反的关系很奇怪。对于 SQL 开发人员来说,这是常见的情况。开发一个ORM(对象关系映射器)这是问题之一。 (我知道这一点,因为我现在正在为 Objective-Cloud 这样做。但如果不同,更多的是 OOP 的观点,我是这样做的。)每个解决方案对一方来说都是不同寻常的。有人称 ORM "vietnam of software development".
举一个更简单的例子:为体育联盟建模,您会发现自己有一个实体 Match
,其属性为 homeTeam
和 guestTeam
。您想要的是反向关系,不是 homeMatches
和 guestMatches
,而是 matches
。这显然不是倒数。如果 Core Data 想要并且不关心它,只需添加反向关系。