NoSQL有什么开创性的东西吗?[关闭]


46

我是一个非常扎实的关系数据库专家,并且一路了解第3种范式,欣赏SQL的代数集理论根源,并且可能使(或不与)一颗破碎的心联系起来。

我还没有找到与妻子约会之夜的关系数据库结构,但是我想过与妻子约会之夜的关系数据库项目。

现在,我听到有关NoSQL并对其进行研究。顺其自然,NoSQL是否具有开创性,在数学上是新颖的,还是“嘿,您甚至根本不需要关联地组织数据,这要容易得多”吗?

NoSQL是否像数据结构的超级外壳?在我看来,数据最终必须具有要检索的结构,并且检索必须以某种语言来定义。


2
哪些类型的NoSQL数据库没有结构?文档数据库可以是分层的,但是将其数据最少存储在包含某种格式数据的文档中。图形数据库和键值存储是不言自明的。哪些NoSQL数据库没有查询语言?作为两个示例,某些文档数据库只是文本搜索或XQuery for XML。SPARQL用于RDF存储。
Thomas Owens

2
更新“我在与妻子约会之夜就考虑过关系数据库项目。” :)大声笑。也是个好问题。
罗克兰

2
NoSQL数据库确实具有结构,但是该结构并不总是容易映射到关系代数。不同的NoSQL使用不同的结构,其中一些是键值哈希图,层次结构,对象数据库,图形数据库或文档存储,它们是NoSQL的常见类型。NoSQL真正的全部目的就是认识到SQL不是万灵药,某些问题域很难映射到SQL /关系代数。
Lie Ryan

7
NoSQL是一个令人误解的名称。它表示具有特征的组,而唯一的共同特征不是经典的关系SQL数据库。这是一个开放的场景。这就像将所有非面包类食品描述为“非面包类家庭”一样。
Pieter B

2
好的,关于NoSQL的大惊小怪是什么?这很容易:我们有一代人成长于关系数据库,这是他们拥有的唯一工具。因为如果只用锤子,一切都会变成钉子。然后,您会遇到一些丑陋的事情,例如试图将对象放入关系数据库中或在此之上构建搜索引擎。一个很大的认识是:SQL数据库对很多事情都有好处,但并不是所有事情都有好处。“不是一切”才是大事。
Pieter B

Answers:


24

NoSQL比革命性更具进化性。它实质上将“外部数据库存储”的现有思想与“使用熟悉的数据结构而不是关系表”结合在一起。

数据库的类型多于关系数据库,例如分层数据库。虽然按照今天的标准来说是过时的,但它与数据的数据结构(例如COBOL记录)的结合非常好。关键是,数据库中的数据是按照使用记录的编程语言对记录进行布局的方式进行建模的。

快速发展关系数据库的发明,其中数据库最终将关注点分离开了,并且经过适当的规范化,是一种可视化大多数数据类型和数据之间关系的好方法。与其他类型的数据库相比,它确实很容易理解。但是,它完全失败的是以镜像程序中对象和类的方式存储数据。因此,对象关系映射的发明。换句话说,数据库的设计实际上是使用它的程序的障碍,这就是为什么我们需要ORM库(例如Hibernate)的原因。尽管既干净又一致,但在我的脑海中总会产生令人doubt惑的怀疑,那就是那里有些不对劲。

这带来了另外两种类型的数据库,即对象数据库NoSQL

两者都试图解决关系数据库引入的问题,同时又不使我们暴露于层次数据库令人费解的恐惧中。数据仍然摆放在与表相似的存储库中,但实际上,关系表更像是编程数据结构。尽管对象数据库大多遵循定义明确的规则,但我的理解是NoSQL相当随意。例如,一个表可能被可视化为哈希表或数组。没有一种简单,明确的方法可以使用类似于Oracle SQL DeveloperSQL Server Management Studio的任意工具来查询它们。

这种想法是,可以定义易于在代码中搜索的数据结构,而不是将更适合SQL数据库引擎的SQL查询拼凑在一起,而不是表达人们想要的查询。例如,模糊或部分匹配更加困难,并且在关系数据库中的执行效果更差,而NoSQL数据库可能具有针对此类搜索进行优化的结构,并且可以在很短的时间内完成。

有查询NoSQL的语言。但是,没有通用语言,例如用于关系数据库的SQL。


后期编辑:

虽然我对NoSQL数据库非常熟悉,但是这个问题促使我购买了一本有关该主题的高质量书籍,并开始阅读该书,最终目标是成为该主题的真正专家。剩下的意见是基于NoSQL的精粹:一个简短的指南多语种持久性的新兴国家通过普拉莫德Sadalage马丁·福勒

作者指出,关系数据库无法很好地扩展到能够提供Amazon和Google等站点所需数据的集群:NoSQL是为适应这一细分市场而开发的,它放松了ACID的并发性和持久性,以便处理大量的查询。大量使用静态数据(因此,ACID事务不那么重要)。

此外,他们认为NoSQL数据库无需模式即可运行(第10页),该模式使NoSQL数据库可以更轻松地修改数据结构。在这方面,我不确定是否存在正式模式,因为SQL数据库也允许修改模式。无论如何,两位著名的作者提出了这一主张,因此值得研究。

我相信这两个要点仅是为了证明我的主要观点,即NoSQL是进化的,而不是革命的。他们仍然存储数据,并逐步扩展规模和可修改性。他们还指出,NoSQL不会试图取代关系数据库作为数据存储的王者,而只是为需要按(他们认为)关系缩放和变形的数据类型提供替代的数据存储方式数据库支持不够好。


2
某些NoSQL数据库确实具有查询语言。如果数据存储在XML或RDF中,我以前使用过XQuery和SPARQL。那些语言倾向于结构化和查询性。但是话又说回来,它仅涵盖NoSQL数据库,这些数据库包含定义明确的数据格式,并且对文本或键值对没有多大作用。
Thomas Owens

@ThomasOwens我编辑了答案以更具体。

1
这是NoSQL的有趣概述,但并未真正回答实际问题。据我所知,关于NoSQL的唯一“开创性”之处在于,数据在存储之前不需要符合特定的结构。
罗克兰

2
In other words, the design of the database is actually a hindrance to the design of the program that uses it, ...在很多情况下,我感到这是把车推到了马的前面。对于具有大数据集的大企业而言,数据具有难以置信的价值,并且将持续非常长的时间-比当前的热门编程语言,工具和范例更长。可以说OOP是数据库设计的障碍,而尝试更改数据库设计以适应编程范例可能不是最好的主意。
Doval

2
我要指出的是,我们仍然在大量使用一种分层数据库实现-称为文件系统。
Wyatt Barnett

13

我认为您绝对希望阅读Erik Meijer和Gavin Bierman撰写的这篇论文,标题为“与流行的看法相反,SQL和NoSQL实际上只是同一枚硬币的两个方面”。简而言之,它声称从数学上讲,这两种方法都基于相同的理论,但有一些差异。

在我看来,几个有趣的区别如下:交叉类型依赖关系(SQL中为FK)的方向在SQL和NoSQL中是相反的,并且集合类型不限于在NoSQL中设置(因此有一些基于集合论的操作)可能不再适用于NoSQL世界,但其他一些仍然有效)。本文的另一个有趣之处是提出了用于查询SQL和NoSQL数据库的单一查询语言。它被称为LINQ,如果您认为您以前可能曾听过这个名字,那您是对的:这是Microsoft从C#查询的语言。


1
“本文的另一个有趣之处是提出了用于查询SQL和NoSQL数据库的单一查询语言。它称为LINQ”,这并不完全正确,'Linq'不能以1:1的方式映射到SQL。必须使其能够在SQL DB上工作。这意味着可以引入任何内容来查询这两者,只要有一个转换层即可确保它在目标数据库上运行
Frans Bouma,2014年

6
可以说SQL也不直接在数据库上执行。执行的是一个执行计划,并且有人还可以说Linq可以直接转换为执行计划。所以毕竟没什么大不同。
Haspemulator 2014年

10

Snowman的答案正确地描述了SQL和NoSQL在数据结构上的不同之处以及如何访问它们。但是,可能更重要的区别是它们各自的问题范围。

NoSQL不是SQL的后继者。而是,NoSQL各个分支牺牲了SQL的某些特质,以便更好地发挥其他特质CAP定理指出,任何分布式数据库系统都不可能满足以下所有属性:

  • 一致性
  • 可用性
  • 分区容限

因此,某些NoSQL变体改而遵循BASE原理,从而放宽了ACID的始终完全一致性约束,ACID是经典SQL数据库的基础。通过失去一些一致性保证,它们可以将广泛分布的系统中的高可用性和分区容忍度相结合,例如对于具有大量数据和用户查询但对完美一致性的需求很少的网站。因此,此类NoSQL数据库是GoogleFacebookAmazon的核心。因此,回答您的问题:是的,NoSQL是突破性的,因为它几乎启用了如此庞大的Web服务。

这只是一个例子,因为NoSQL是一个多样化的领域,它的变体涵盖了CAP三角形内几乎所有可能的参数组合


我对ElasticSearch不熟悉。甲快速谷歌搜索似乎表明它sacrificies一致性(C),因此是AP,不CAP,这在理论上是不可能的。编辑:这是对现在已经消失的评论的回应,该评论暗示ElasticSearch满足所有CAP属性。
Florian von Stosch 2014年

3
哦,多么可爱,他们和BASE一起对抗ACID。是否有一种称为REDOX或SALT的中间方法?
Patrick M

3

与基于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批准流程和访问限制。两种情况下均无不利影响。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.