我意识到这可能是很多人的常识,所以如果这似乎是一个愚蠢的问题,那么请原谅我。
我正在尝试学习用于iOS编程的核心数据,我已经反复阅读和听到它说过,核心数据(CD)不是一个关系数据库。但是,关于这一点,很少有人说过其他的话,或者说,为什么要知道学术意义之外的事情是非常重要的。我的意思是,至少从功能上来说,你似乎可以把CD当作一个数据库来使用--存储和获取数据,运行查询等等。从我对它的基本理解来看,我看不出它与数据库有什么不同。
我并不怀疑这一区别是重要的。我相信很多聪明的人不会在这一点上浪费他们的时间,如果它不是有用的理解。但我希望有人能解释一下--最好是举例说明-- CD不是一个关系数据库是如何影响我们如何使用它的?或者,如果我没有被告知CD不是一个关系数据库,这将如何对我作为一个目标-C/Swift程序员的性能产生不利影响?
如果将CD作为关系数据库处理,是否会尝试不正确地做一些事情?或者,关系数据库是否做不到或做得不如CD设计要做的那么好?
感谢大家的集体智慧。
发布于 2014-10-28 17:34:47
人们强调“非关系型数据库”的角度,因为拥有一定数据库经验的人在使用核心数据时容易出现特定的错误,这些错误是由于试图太直接地应用他们的经验而导致的。下面是一些例子:
核心数据可以而且经常用作数据库,但是从其他关系数据库的角度来考虑它是一个很好的方法。
发布于 2014-10-28 03:26:00
核心数据是一种具有许多强大功能和工具的技术,例如:
名单还在继续。
核心数据的持久化部分由SQLite支持,这是一个关系数据库。
我认为人们强调Core数据不是关系数据库的原因之一是,它不仅仅是持久性,而且可以在不使用持久性的情况下加以利用。
通过将核心数据视为关系数据库,我假设您的意思是对象之间的关系由I映射,即客户有customerId,产品有productId。这肯定是不正确的,因为Core数据让我们在对象模型之间定义强大的关系,从而使事情更易于管理。
例如,如果您希望您的客户拥有多个产品,并且希望在删除客户时将它们全部删除,那么Core Data将使您能够做到这一点,而无需管理customerIds/productIds,并解决如何格式化复杂的SQL查询以匹配内存中的模型。使用Core数据,您只需更新模型并保存上下文,SQL就会在幕后为您完成。(实际上,您甚至可以打开调试,通过传递'-com.apple.CoreData.SQLDebug 1‘作为启动参数来打印SQL数据。
在性能方面,Core Data在幕后进行了一些严重的优化,使得访问数据变得更加容易,而不必深入研究SQL、并发或验证。
发布于 2014-10-28 21:09:33
我认为关键是,它与关系数据库不同,试图应用关系技术将导致开发人员误入歧途,就像其他人提到的那样。实际上,它通过将关系数据库的功能从代码中抽象出来,在更高的级别上运行。
从编程的角度来看,一个关键的区别是您不需要唯一的标识符,因为核心数据只是处理这个问题。如果你试图创造你自己的,你会发现他们是多余的和很多额外的麻烦。
从程序员的角度来看,每当你访问一个实体“记录”,你就会有一个指向任何关系的指针--也许是一个指向“一对一”关系的指针,或者一组指向“多到多”关系中的记录的指针。当使用其中一个指针时,核心数据处理实际“记录”的检索。
由于Core数据有效地处理错误(指针引用的“记录”(对象)不在内存中),所以一般不必考虑它们的检索。当程序需要它们时,核心数据将使它们可用。
到头来,它提供了类似的功能,但在引擎盖下它是不同的。它确实需要一些不同的思考,因为普通的SQL在Core数据的上下文中没有意义,因为SQL (在sqlite存储的情况下)是为您处理的。
对我来说,在转换到核心数据时的主要调整是--摆脱了唯一标识符的概念。他们是在幕后进行,但你永远不必担心他们,不应该试图定义自己的。对我来说,第二个调整是,每当您需要与您的对象相关的对象时,只需在您已经拥有的实体对象中使用适当的指针来获取它。
https://stackoverflow.com/questions/26599599
复制相似问题