针对Web开发人员,DBA,程序员,本文介绍了NoSQL数据库的基本概念,不同类型及其特性。
当你想为你的应用程序或网站选择一个数据库时,哪些数据库在你的考量之中?是MySQL,Oracle,PostgreSQL还是MS SQL?你有没有注意到所有这些数据库的共同之处?是的,他们都是RDBMS,而且使用SQL与数据进行交互。如果你想要超越RDBMS和SQL,去寻找新的,非常规的东西,并尝试提供更好的性能和可扩展性,该怎么办?
每当我开始阅读关于数据库管理系统的书籍时,他总是会假定数据的关系模型,以及每种类型的数据都必须存储在一张表中,然而NoSQL显然属于“其他类型的数据库”。
你不觉得这不公平吗?我们需要一个更灵活的方法,而不是试图找到一种方法来将数据匹配数据库,相反,我们应当尝试找到一种方法,使数据库能够主动去匹配数据。因此,我们的选择主要取决于我们试图存储在数据库中的数据类型。
你可能会认为NoSQL是“反SQL”。实际上,它代表“不仅SQL”。它的目的不是反对SQL,而是在存储和与数据库交互的方式上提供一个可行的选择。许多NoSQL数据库也提供了一个类似于SQL的查询接口。实际上,这两种数据库都是互补的; 它们是为了解决不同的问题而建立的,并且可以很容易地相互共存。
常见的误解
关于NoSQL最常见的误解有:
- “NoSQL数据库不受安全问题(如SQL注入攻击)的影响。“
事实上,由于大多数NoSQL数据库还不够成熟,安全性仍然是他们面临的一个大问题。
- “如果发现RDBMS或SQL很难使用,切换到NoSQL。”
实际上更可能的是,如果你发现传统数据库用起来很困难,那么NoSQL将是一个更大的麻烦 - 所以你最好不要贸然跳入未知领域!
CAP定理
早些时候,人们认为关系数据库必须满足四个基本要求,即ACID,否则这个数据库系统就不是良好的。NoSQL数据库偏离了这个概念,转而拥抱由Eric Brewer于2000年制定的更新的CAP定理或布鲁尔定理。该定理讨论了一致性,可用性和分区容差的三个基本属性,同时认为分布式数据库只能满足其中两个。
NoSQL分布式数据库通过使用所谓的最终一致性来遵循这一点。这是一种更为宽松的一致性形式,其中一致性是在一段足够的时间内实现的,而不是立即得到保证。这样做可以在很大程度上提高可用性和可伸缩性。有些人已经开始把这个范式称为BASE(基本可用,软状态,最终一致性)。
(对于BASE理论,以下两个链接或有有更深层或更精确的见解)
(https://blog.csdn.net/historyasamirror/article/details/4458369)
(https://www.techopedia.com/definition/29164/basically-available-soft-state-eventual-consistency-base)
你可能会说RDBMS(关系数据库管理系统)是成熟的,健壮的,可靠的和经过时间考验的。但是,你是否知道关于关系模型的第一篇文章出现于1970年?在我看来,那已经很老了!NoSQL数据库是未来,并且在未来几年必将成为上升的技术。它们不仅有效地利用了现代云计算和分布式计算概念,而且改变了我们对DBMS的思考方式。
NoSQL数据库也被一些大型的互联网公司在其软件架构中使用。然而,你很少会听说某个公司已经数据库转型了, 或者最近一直在做的是为不同类型的应用程序和功能使用不同的数据库。以Facebook为例:除了在其数据库中使用MySQL外,它还使用Apache Cassandra作为存储系统,用于Facebook邮件中收件箱搜索的反向索引,同时还将Apache Hadoop用于其他用途。
以下是Facebook工程博客上的内容:“Apache Hadoop被用于三大类系统:作为Web分析的仓库,作为分布式数据库的存储以及MySQL数据库备份。”
为什么选择NoSQL?
现在,我们来讨论一下NoSQL数据库具有的常见功能,以及为什么他们现在越来越受欢迎:
- 大数据:在处理大数据时 - 大量的的读写周期,庞大的用户数量和PB级数据,NoSQL数据库可以轻松实现。
- 无模式化:大多数NoSQL数据库都是无模式的,并且非常灵活。它们在构建模式时提供了许多选择,因此可以轻松地将对象映射到它们中。你可以摆脱标准化和复杂联接等技术!
- 程序员友好:这些数据库的优势在于,它们可以在每种主要编程语言中提供简单的API,避免了对复杂ORM框架的需求。即使它不适用于特定的编程语言,也可以通过简单的RESTful API(使用XML或JSON)轻松地通过HTTP访问数据。
- 可用性:由于大多数NoSQL数据库是分布式的,它们提供了简单的数据复制,而一个节点的故障不会影响数据的可用性 - 它在性能方面只是一个小小的障碍。
- 高度可扩展性:这是这些数据库最近风靡一时的主要原因,因为它们不需要专用的高性能数据库服务器。实际上,它们可以轻松地在一组商用硬件上运行; 扩展只是增加一个新节点的问题。
- 低延迟:使用这些数据库可以实现几毫秒级的延迟,但它也取决于可以加载到内存中的数据量。但是,由于我们可能主要是在处理一组数据服务器,我不认为内存会成为问题。
NoSQL数据模型
一些主要的NoSQL数据库可以区分为以下类型:
- 文档数据库(面向文档的数据库系统)
- 层次数据库
- 图数据库
- 列式数据库(柱状数据库管理系统)
- 面向对象的数据库
- 键值存储数据库
- RDF三重存储
文档数据库
如今,数据不再像简单的行或列一样简单; 它通常在Web上以XML或JSON的形式表示,因为这些技术是高度可移植的,紧凑和标准化的。因此,不是试图将这些XML或JSON文档映射到关系表单中,而是使用市场上已有的一些文档存储更为合理。
正如你所猜测的,这些数据库是无模式的,因为XML / JSON文档没有预定义的格式,每个文档都是独立的。
数据库的示例用例包括CRM,Web相关数据,实时数据等。一些最流行的实现包括MongoDB,CouchDB和RavenDB等数据库。实际上,MongoDB等数据库已被Foursquare,bit.ly,SourceForge等网站用于在生产环境中存储数据。
层次数据库
从术语中可以看出,层次数据库以树或父子关系的形式存储层次相关的数据。就关系模型而言,这可能被称为1:N关系。在最近的观点中,地理空间数据库可以用于分层模型来存储位置信息,这种信息本质上是分层的(就像大陆由国家构成一样,这些国家由国家组成,然后是城市等等)虽然实际算法有所不同
如地理标记和地理定位功能近来越来越流行。地理空间数据库专门存储空间相关的地理信息,并可用于地理信息系统。这些数据库的一些例子包括PostGIS,Oracle Spatial等。层次数据库的其他一些实现包括由IBM开发的IMS数据库 - 当然还有Windows注册表。
图数据库
网络数据库最流行的形式是图形数据库,用于存储可以使用图论以图的形式表示的数据。这类数据通常具有成倍增长的潜力。这些数据库可用于存储频繁更改的数据; 以表格的形式表示会严重破坏数据的查询方式。
图数据库可以实现内置图处理引擎,当涉及遍历图形数据时可以提供非常高的性能。图数据库的实际使用案例包括FlockDB,由Twitter开发并用于实现其用户数据库,并描绘出一幅关注与被关注之间关系的图。它使用Gizzard框架,每秒查询数据库达10,000次。
查询图的一般技术是从任意或指定的起始节点开始,然后根据符合指定标准的关系,以深度优先或宽度优先的方式开始遍历图。主要的图数据库允许开发人员使用简单的API来完成这样的工作,并使其成为一项简单的任务。例如,他们可能会允许我们提出这样的查询请求:“Rohan是否认识某个专业的律师?”
一些最流行的图数据库包括Neo4j,HyperGraphDB等。这些数据库可用于许多应用程序,其中最受欢迎的应用程序当然是社交网络,而其他应用程序则包括复杂的图形分析,安全性,遗传学等。
列式数据库
列式NoSQL数据库最初受到Google关于其BigTable分布式存储系统的研究报告的启发,Google在内部使用Google文件系统作为分布式文件系统,从而导致对数据模型进行各种开源的注解。最引人注目的一些也是NoSQL的潮流,比如Hadoop HBase,Apache Cassandra,HyperTable等。
在这里,与其将数据存储在刚性的类似表格的行和列中,不如将数据存储为稀疏的数据矩阵 - 例如,在Excel工作表中,只定义了列族,并且列本身可以是动态定义。
它存储得更像一个三维数组,其中一个维度是行标识符 —— 一个主键; 第二个是列族和列标识符的组合; 第三维由时间戳组成,其中相同数据的多个预定义被堆叠在彼此之上。面向列的数据库如Cassandra正在被Facebook,Digg,Reddit,Cisco WebEx等使用。
面向对象的数据库
虽然这些数据库相当“古老”,已经存在了好几年,但仍然可以算作NoSQL数据库,因为它们背离了传统的关系数据模型。这些数据库旨在通过将面向对象的概念应用于数据库本身来减少面向对象的编程语言和数据持久层之间的“阻抗不匹配”。这允许以对象的形式存储数据高度透明。
这些数据库使用对象标识符来唯一标识每个对象; 即使对象内的所有数据都发生了变化,它仍然是一样的。一些最流行的面向对象数据库是db4o,Versant,Objectivity,NEO等。这些数据很少用于生产或具有Web规模项目的目的,并且通常在研究环境中见到。
键值存储数据库
与面向列的数据库相比,键值存储更多地基于亚马逊的Dynamo Research论文和分布式哈希表。当我谈论键值存储数据库时,我的意思是简单的没有过多修饰的存储,尽管从技术上讲,像HBase,Cassandra等数据库也可能属于这个范畴内。
在这里,数据模型已被简化为只包含一组全局键值对,其中每个值都有一个唯一的关键字。此密钥用于在需要时访问数据。
至于“值”,数据库通常与存储的内容没有关系,只是将数据存储为blob(二进制大对象)。其结果是,我们实现了非常简单并具有卓越性能的高可扩展性数据库。
一些键值存储数据库持续吸引我的注意力,包括Project Voldemort,Tokyo Cabinet,Redis,GT.M等。此外,需要提及的是Project Voldemort是一个由LinkedIn开源的数据库,同时也是它在生产环境中使用。
三重存储
三重存储也是一种网络数据库,但不同之处在于它们以主谓宾的形式存储三元数据,其中谓词确定主体和对象之间的关系,同时作为数据本身的一部分。
例如,我们来看一下“沙氏住在孟买”。在这里,“沙氏”是主体,“孟买”是客体,“住在”指定沙氏和孟买之间的关系,所以它是谓词。这种类型的数据通常在构建语义Web应用程序时出现,RDF三元组用于表示这些数据。
在这里,你可以说这种类型的数据可以很容易地建模成RDBMS。我同意,但让我指出,它将被证明是非常低效的。此外,在关系模型中不能提供一些可以制作图论的分析。而且,将一些语义查询映射到SQL也很困难。我遇到的一些受欢迎的三重商店包括Jena,Sesame,Virtuoso,AllegroGraph等。
进一步阅读
这里有一些与本文相关的链接,我发现它们很有趣 - 请点进去看看!
- Codd,EF(1970)。“大型共享数据库的数据关系模型”[ PDF ]
- Facebook工程公司的笔记
- “BigTable:结构化数据的分布式存储系统”
- “迪纳摩:亚马逊高度可用的关键价值商店”[ PDF ]
- Project Voldemort:在LinkedIn上扩展简单存储
- myNoSQL
- NoSQL数据库列表