我是一个非常扎实的关系数据库专家,并且一路了解第3种范式,欣赏SQL的代数集理论根源,并且可能使(或不与)一颗破碎的心联系起来。
我还没有找到与妻子约会之夜的关系数据库结构,但是我想过与妻子约会之夜的关系数据库项目。
现在,我听到有关NoSQL并对其进行研究。顺其自然,NoSQL是否具有开创性,在数学上是新颖的,还是“嘿,您甚至根本不需要关联地组织数据,这要容易得多”吗?
NoSQL是否像数据结构的超级外壳?在我看来,数据最终必须具有要检索的结构,并且检索必须以某种语言来定义。
我是一个非常扎实的关系数据库专家,并且一路了解第3种范式,欣赏SQL的代数集理论根源,并且可能使(或不与)一颗破碎的心联系起来。
我还没有找到与妻子约会之夜的关系数据库结构,但是我想过与妻子约会之夜的关系数据库项目。
现在,我听到有关NoSQL并对其进行研究。顺其自然,NoSQL是否具有开创性,在数学上是新颖的,还是“嘿,您甚至根本不需要关联地组织数据,这要容易得多”吗?
NoSQL是否像数据结构的超级外壳?在我看来,数据最终必须具有要检索的结构,并且检索必须以某种语言来定义。
Answers:
NoSQL比革命性更具进化性。它实质上将“外部数据库存储”的现有思想与“使用熟悉的数据结构而不是关系表”结合在一起。
数据库的类型多于关系数据库,例如分层数据库。虽然按照今天的标准来说是过时的,但它与数据的数据结构(例如COBOL记录)的结合非常好。关键是,数据库中的数据是按照使用记录的编程语言对记录进行布局的方式进行建模的。
快速发展关系数据库的发明,其中数据库最终将关注点分离开了,并且经过适当的规范化,是一种可视化大多数数据类型和数据之间关系的好方法。与其他类型的数据库相比,它确实很容易理解。但是,它完全失败的是以镜像程序中对象和类的方式存储数据。因此,对象关系映射的发明。换句话说,数据库的设计实际上是使用它的程序的障碍,这就是为什么我们需要ORM库(例如Hibernate)的原因。尽管既干净又一致,但在我的脑海中总会产生令人doubt惑的怀疑,那就是那里有些不对劲。
两者都试图解决关系数据库引入的问题,同时又不使我们暴露于层次数据库令人费解的恐惧中。数据仍然摆放在与表相似的存储库中,但实际上,关系表更像是编程数据结构。尽管对象数据库大多遵循定义明确的规则,但我的理解是NoSQL相当随意。例如,一个表可能被可视化为哈希表或数组。没有一种简单,明确的方法可以使用类似于Oracle SQL Developer或SQL Server Management Studio的任意工具来查询它们。
这种想法是,可以定义易于在代码中搜索的数据结构,而不是将更适合SQL数据库引擎的SQL查询拼凑在一起,而不是表达人们想要的查询。例如,模糊或部分匹配更加困难,并且在关系数据库中的执行效果更差,而NoSQL数据库可能具有针对此类搜索进行优化的结构,并且可以在很短的时间内完成。
有查询NoSQL的语言。但是,没有通用语言,例如用于关系数据库的SQL。
后期编辑:
虽然我对NoSQL数据库非常熟悉,但是这个问题促使我购买了一本有关该主题的高质量书籍,并开始阅读该书,最终目标是成为该主题的真正专家。剩下的意见是基于NoSQL的精粹:一个简短的指南多语种持久性的新兴国家通过普拉莫德Sadalage和马丁·福勒。
作者指出,关系数据库无法很好地扩展到能够提供Amazon和Google等站点所需数据的集群:NoSQL是为适应这一细分市场而开发的,它放松了ACID的并发性和持久性,以便处理大量的查询。大量使用静态数据(因此,ACID事务不那么重要)。
此外,他们认为NoSQL数据库无需模式即可运行(第10页),该模式使NoSQL数据库可以更轻松地修改数据结构。在这方面,我不确定是否存在正式模式,因为SQL数据库也允许修改模式。无论如何,两位著名的作者提出了这一主张,因此值得研究。
我相信这两个要点仅是为了证明我的主要观点,即NoSQL是进化的,而不是革命的。他们仍然存储数据,并逐步扩展规模和可修改性。他们还指出,NoSQL不会试图取代关系数据库作为数据存储的王者,而只是为需要按(他们认为)关系缩放和变形的数据类型提供替代的数据存储方式数据库支持不够好。
In other words, the design of the database is actually a hindrance to the design of the program that uses it, ...
在很多情况下,我感到这是把车推到了马的前面。对于具有大数据集的大企业而言,数据具有难以置信的价值,并且将持续非常长的时间-比当前的热门编程语言,工具和范例更长。可以说OOP是数据库设计的障碍,而尝试更改数据库设计以适应编程范例可能不是最好的主意。
我认为您绝对希望阅读Erik Meijer和Gavin Bierman撰写的这篇论文,标题为“与流行的看法相反,SQL和NoSQL实际上只是同一枚硬币的两个方面”。简而言之,它声称从数学上讲,这两种方法都基于相同的理论,但有一些差异。
在我看来,几个有趣的区别如下:交叉类型依赖关系(SQL中为FK)的方向在SQL和NoSQL中是相反的,并且集合类型不限于在NoSQL中设置(因此有一些基于集合论的操作)可能不再适用于NoSQL世界,但其他一些仍然有效)。本文的另一个有趣之处是提出了用于查询SQL和NoSQL数据库的单一查询语言。它被称为LINQ,如果您认为您以前可能曾听过这个名字,那您是对的:这是Microsoft从C#查询的语言。
Snowman的答案正确地描述了SQL和NoSQL在数据结构上的不同之处以及如何访问它们。但是,可能更重要的区别是它们各自的问题范围。
NoSQL不是SQL的后继者。而是,NoSQL的各个分支牺牲了SQL的某些特质,以便更好地发挥其他特质。CAP定理指出,任何分布式数据库系统都不可能满足以下所有属性:
因此,某些NoSQL变体改而遵循BASE原理,从而放宽了ACID的始终完全一致性约束,ACID是经典SQL数据库的基础。通过失去一些一致性保证,它们可以将广泛分布的系统中的高可用性和分区容忍度相结合,例如对于具有大量数据和用户查询但对完美一致性的需求很少的网站。因此,此类NoSQL数据库是Google,Facebook和Amazon的核心。因此,回答您的问题:是的,NoSQL是突破性的,因为它几乎启用了如此庞大的Web服务。
这只是一个例子,因为NoSQL是一个多样化的领域,它的变体涵盖了CAP三角形内几乎所有可能的参数组合。
与基于SQL的普通数据库相比,NoSQL的常见用例在生产率上取得了突破性的进展。这有几个因素。
一种是家政服务。大多数NoSQL是开源的,可以使用一些命令将其安装在工作站或VM上,并且可以在开箱即用的情况下使用合理的默认值。以我的经验,甚至Postgres和MySQL也不是这样。出于开发目的,通常甚至在工作站上也必须进行配置。
另一个是便捷的开发,如其他答案已详细描述。Mongo的JSON索引功能,或redis和Riak的键/值语义,可能是完成工作所需的所有某些Web应用程序,并且这些API很简单。某些NoSQL提供了自己的RESTful API,而使用SQL则通常必须自己编写它们。
这些因素使NoSQL数据库对小型项目具有吸引力。接机时间往往很短。当然,当您投入生产时,必须配置安全性和规模,但是快速开始编码和协作的能力非常强大,而且我认为这是开创性的。
此外,与上述情况相关,对于小型应用程序(如公司内部或应用程序到应用程序服务),团队可能可以建立生产NoSQL数据库,而无需他们的DBA团队参与,也不会影响性能或完整性。结果出现问题。专业的DBA可能不喜欢这样,但是将DBA视为障碍(是非)的开发人员有时会将NoSQL视为绕过必须处理它们的一种方式。我承认这一点-我曾经将小型应用程序从Postgres更改为SQLite,以减少对抗性DBA,并且我选择在Mongo上而不是Oracle上实施,以避免DBA批准流程和访问限制。两种情况下均无不利影响。