"核心数据不是关系数据库." 为什么这一点很重要?

TJ *_*ers 9 database core-data ios

我意识到这可能是很多人的常识,所以如果这看起来像一个愚蠢的问题,请道歉.

我正在尝试学习iOS编程的核心数据,我反复阅读并听说它说核心数据(CD)不是关系数据库.但是关于这一点的其他内容却很少,或者为什么超越学术意识才知道这一点很重要.我的意思是至少在功能上,似乎你可以使用CD,好像它是大多数事物的数据库 - 存储和获取数据,运行查询等.从我对它的基本理解,我真的不知道它与数据库.

我并不怀疑这种区别很重要.我相信很多聪明人都不会浪费时间在这一点上,如果它没有用的理解.但是我希望有人能够解释 - 最好是用例子 - CD不是关系数据库如何影响我们如何使用它?或者,如果我没有被告知CD不是关系数据库,那么这会如何对我作为Objective-C/Swift程序员的表现产生负面影响?

如果将CD视为关系数据库,那么有人可能会尝试做错吗?或者,关系数据库不能做什么或者CD设计用的做得不好?

谢谢大家的集体智慧.

Tom*_*ton 12

人们强调"不是关系数据库"的角度,因为具有一定数据库经验的人容易因为尝试过于直接地应用他们的经验而导致Core Data出现特定错误.一些例子:

  • 创建基本上是SQL联结表的实体.这几乎不是必需的,通常会使事情变得更加复杂和容易出错.Core Data直接支持多对多关系.
  • 在实体中创建唯一的ID字段,因为他们认为他们需要一个以确保唯一性并创建关系.有时创建自定义唯一ID很有用,通常不会.
  • 基于这些唯一ID设置对象之间的关系,而不是使用Core Data关系 - 即保存相关对象的唯一ID,而不是使用ObjC/Swift语义来关联对象.

核心数据可以并且通常可以充当数据库,但是根据其他关系数据库来考虑核心数据是一个很好的方法.

  • `NSManagedObject`有一个内置的`objectID`字段,用于此目的.您通常不需要创建ID,因为您已经拥有了ID. (2认同)

Kry*_*ski 7

核心数据是一项具有许多强大功能和工具的技术,例如:

  1. 更改跟踪(撤消/重做)
  2. 错误(不必加载可以节省内存的整个对象)
  3. 坚持

名单继续..

Core Data的持久性部分由SQLite支持,SQLite是一个关系数据库.

我认为人们强调Core Data不是关系数据库的原因之一是因为它不仅仅是持久性,而且可以在不使用持久性的情况下利用它.

通过将Core Data视为关系数据库,我假设您的意思是对象之间的关系由id映射,即Customer有customerId,product有productId.这肯定是不正确的,因为Core Data允许您在对象模型之间定义强大的关系,使事情易于管理.

例如,如果您希望让您的客户拥有多个产品并希望在删除客户时删除所有产品,则Core Data使您无需管理customerIds/productIds并确定如何格式化复杂的SQL查询匹配您的内存模型.使用Core Data,您只需更新模型并保存上下文,SQL就是为您完成的.(事实上​​,您甚至可以通过传递'-com.apple.CoreData.SQLDebug 1'作为启动参数来打开调试以打印出SQL Core Data正在执行的操作.

在性能方面,Core Data进行了一些严格的优化,使访问数据变得更加容易,而无需深入研究SQL,并发或验证.