CloudKit 架构设计

Posted

技术标签:

【中文标题】CloudKit 架构设计【英文标题】:CloudKit schema design 【发布时间】:2016-11-09 01:41:10 【问题描述】:

我已经使用 Core Data 编写了我的本地数据模型。它是面向对象的,所以我的核心数据模型中有这样的东西:

class Pair 
   var uuid: NSUUID
   var me: Person
   var friend: Person


class Person 
   var name: String
   var birthday: NSDate
   var address: Address


class Address 
   var streetNumber: Int16
   var streetName: String
   var zip: Int16

现在在 CloudKit 中,我意识到如果我想获取“Pair”及其所有数据,并且我制作“Person”和“Address”CKReference,那么我将不得不获取“Person”和“Address " 这是两个额外的网络调用和大量逻辑来异步处理它们的结果。因此,我正在考虑“非规范化”这些数据并将其全部放入 CloudKit 模式中的“对”CKRecord,而无需任何CKReferences。所以更多的是这样的:

class CloudKitPair 
   var uuid: NSUUID
   var myName: String
   var myBirthday: NSDate
   var myStreetNumber: Int16
   var myStreetName: String
   var myZip: Int16
   var friendName: String
   var friendBirthday: NSDate
   var friendStreetNumber: Int16
   var friendStreetName: String
   var friendZip: Int16

以这种方式设计我的 CloudKit 架构以避免对 CKReferences 的额外网络获取调用是否合法?

【问题讨论】:

【参考方案1】:

以这种方式设计我的 CloudKit 架构以避免对 CKReferences 的额外网络获取调用是否合法?

我会说答案是肯定的,这是一个合法的设计。

请注意,您所做的权衡是优先考虑有效的网络调用而不是有效使用 iCloud 数据库空间。

您提出的设计将导致您多次存储相同的信息。根据您的用例,这可能比理想情况多很多:

例如

Person A Person B Person A Person C Person A Person D

如果这个系列更进一步,那么您将在数据库中多次存储Person A,这可能会被认为是对空间的极大浪费。另一方面,您打算如何使用数据可能是完全合理的。

我建议对您的用例进行建模并根据usage limits that Apple provides for iCloud 对其进行衡量。

【讨论】:

以上是关于CloudKit 架构设计的主要内容,如果未能解决你的问题,请参考以下文章

swift Swift - CloudKit - 部署架构

使用 NSPersistentCloudKitContainer 时,CoreData 架构更改未部署到 CloudKit

架构师成长之路:到底啥是架构设计?该如何理解架构设计?

小议软件架构设计要点

架构设计-架构设计原则

系统架构设计师第七章 软件架构设计