什么是NoSQL?

2017-11-02 12:52:15来源:oschina作者:Dreams-人点击

分享

NoSQL涵盖了各种不同的数据库技术,这些技术是根据构建现代应用程序中提出的要求而开发的:

开发人员正在使用创建大量新的,快速变化的数据类型的应用程序 - 结构化,半结构化,非结构化和多态数据。


十二至十八个月的瀑布发展周期已经过去了。现在,小团队在敏捷冲刺中工作,快速迭代,每一周或两周推送代码,每天甚至多次。


曾经服务于有限受众的应用程序现在作为必须始终处于开放状态的服务提供,可以从许多不同的设备进行访问,并在全球扩展到数百万用户。


现在,组织正在使用开放源码软件,商品服务器和云计算而不是大型单片服务器和存储基础设施的横向扩展架构。

关系数据库的设计不是为了应对现代应用程序的规模和敏捷性挑战,也不是为了利用当今可用的商品存储和处理能力而建立的。


NoSQL数据库类型

文档数据库将每个密钥与称为文档的复杂数据结构进行配对。文档可以包含许多不同的键值对或键阵列对,甚至是嵌套文档。


图形存储用于存储关于数据网络的信息,例如社交连接。图形商店包括Neo4J和Giraph。


键值存储是最简单的NoSQL数据库。数据库中的每个单个项目都将作为属性名称(或“key”)存储在其中。键值存储的示例是Riak和Berkeley DB。一些键值存储(如Redis)允许每个值都有一个类型,例如“integer”,它添加了功能。


针对大数据集的查询优化了诸如Cassandra和HBase之类的宽列存储,并将数据列存储在一起而不是行。

NoSQL的好处

与关系数据库相比,NoSQL数据库更具可扩展性并提供卓越的性能,而数据模型解决了关系模型未设计的若干问题:

大量快速变化的结构化,半结构化和非结构化数据


敏捷冲刺,快速模式迭代和频繁的代码推送


易于使用和灵活的面向对象编程


地理位置分散的横向扩展架构,而不是昂贵的单片架构

动态模式

关系数据库要求在添加数据之前定义模式。例如,您可能希望存储有关客户的数据,例如电话号码,姓名,地址,城市和州名 - SQL数据库需要提前知道您正在存储的内容。


这与敏捷开发方法不兼容,因为每次完成新功能时,数据库的架构往往需要改变。因此,如果您决定开发一些迭代,除了地址和电话号码之外,还要存储客户喜爱的项目,则需要将该列添加到数据库中,然后将整个数据库迁移到新模式。


如果数据库很大,这是一个非常慢的过程,涉及重大的停机时间。如果您经常更改应用程序存储的数据,因为您正在快速迭代 - 此停机时间也可能会很频繁。还没有办法使用关系数据库来有效地处理完全非结构化或未知数据的数据。


构建NoSQL数据库以允许在没有预定义模式的情况下插入数据。这样可以轻松地实时改变应用程序,而不用担心服务中断 - 这意味着开发速度更快,代码集成更加可靠,而且需要更少的数据库管理员时间。开发人员通常不得不添加应用程序代码来强制执行数据质量控制,例如要求存在特定字段,数据类型或允许的值。更复杂的NoSQL数据库允许在数据库中应用验证规则,允许用户在数据之间实施治理,同时保持动态模式的敏捷性优势。


自动分片

由于它们的结构方式,关系数据库通常会垂直扩展 - 单个服务器必须托管整个数据库,以确保交叉表连接和事务的可接受性能。这样做会很快昂贵,限制了规模,并为数据库基础设施创造了相对较少的故障点。支持快速增长的应用程序的解决方案是通过添加服务器而不是将更多容量集中在单个服务器中来水平扩展。


通过SQL数据库可以实现跨越多个服务器实例的“分片”数据库,但通常通过SAN和其他复杂的安排来实现,从而使硬件充当单个服务器。由于数据库本身不提供此功能,开发团队将在多台机器上开展部署多个关系数据库的工作。数据自动存储在每个数据库实例中。开发应用程序代码来分发数据,分发查询,并在所有数据库实例中汇总数据结果。必须开发附加代码来处理资源故障,在不同的数据库之间执行连接,用于数据重新平衡,复制和其他要求。此外,关系数据库的许多好处,如事务完整性,


另一方面,NoSQL数据库通常支持自动分片,这意味着它们可以在任意数量的服务器上自动地传播数据,而不需要应用程序甚至意识到服务器池的组成。数据和查询负载在服务器之间自动平衡,当服务器关闭时,可以快速,透明地替换不应用程序中断。


云计算使这一点显而易见,亚马逊Web服务提供商几乎可以提供无限容量的需求,并且负责所有必要的基础架构管理任务。开发人员不再需要构建复杂,昂贵的平台来支持他们的应用程序,而且可以专注于编写应用程序代码。商品服务器可以提供与单个高端服务器相同的处理和存储功能,只需一小部分价格。


复制

大多数NoSQL数据库还支持自动数据库复制,以便在发生中断或计划维护事件时保持可用性。更复杂的NoSQL数据库是完全自我修复,提供自动故障转移和恢复,以及在多个地理区域之间分发数据库以承受区域故障并实现数据本地化的能力。与关系数据库不同,NoSQL数据库通常不需要单独的应用程序或昂贵的附加组件来实现复制。


集成缓存

许多产品为SQL数据库系统提供缓存层。这些系统可以显着提高读取性能,但它们不会改善写入性能,并且会增加系统部署的操作复杂性。如果您的应用程序由读取主导,则可以考虑分布式缓存,但如果应用程序只有适度的写入卷,则分布式缓存可能无法提高最终用户的整体体验,并将增加管理缓存无效的复杂性。


许多NoSQL数据库技术具有出色的集成缓存功能,可以在系统内存中尽可能多地保存频繁使用的数据,并且无需单独的缓存层。一些NoSQL数据库还为需要最高吞吐量和最低延迟的工作负载提供完全管理的集成式内存数据库管理层。


NoSQL vs. SQL Summary


SQL数据库
NOSQL数据库


类型
一种类型(SQL数据库),具有较小的变化
许多不同的类型,包括键值存储,文档数据库,宽列存储和图形数据库


发展史
开发于20世纪70年代处理第一波数据存储应用
开发于二十世纪二十年代末,以处理SQL数据库的局限性,特别是可扩展性,多结构化数据,地理分布和敏捷开发冲刺


例子
MySQL,Postgres,Microsoft SQL Server,Oracle数据库
MongoDB,Cassandra,HBase,Neo4j


数据存储模型
个别记录(例如“雇员”)以表的形式存储为行,每列存储有关该记录的特定数据(例如,“经理”,“聘用日期”等),与电子表格非常相似。相关数据存储在单独的表中,然后在执行更复杂的查询时连接在一起。例如,“办公室”可能存储在一个表中,“员工”可以存储在另一个表中。当用户想要找到员工的工作地址时,数据库引擎将“员工”和“办公室”表连接在一起以获取所有必要的信息。
基于数据库类型不同。例如,键值存储的功能类似于SQL数据库,但只有两列('key'和'value'),更复杂的信息有时会作为BLOB在“value”列中存储。文档数据库完全取消了表和行模型,将所有相关数据存储在一起,以JSON,XML或其他格式的单个“文档”中,这可以分层次地嵌套值。


架构
预先固定结构和数据类型。要存储有关新数据项的信息,必须更改整个数据库,在此期间数据库必须脱机。
通常是动态的,具有一些执行数据验证规则。应用程序可以随时添加新的字段,与SQL表行不同,可以根据需要将不同的数据存储在一起。对于某些数据库(例如,宽列存储),动态添加新字段更具挑战性。


缩放
在垂直方面,意味着一个服务器必须变得越来越强大,以应对增加的需求。可以通过许多服务器传播SQL数据库,但通常需要大量的额外工程,而且通常会丢失核心关联功能(如JOIN,参照完整性和事务)。
意味着要增加容量,数据库管理员可以简单地添加更多的商品服务器或云实例。数据库会根据需要自动在服务器之间传播数据。


发展模式
开源(例如,Postgres,MySQL)和封闭源(例如Oracle数据库)
开源


支持交易
是的,可以将更新配置为完全完成或完全完成
在某些情况下和某些级别(例如,文档级别与数据库级别)


数据操作
使用Select,Insert和Update语句的特定语言,例如SELECT字段FROM table WHERE ...
通过面向对象的API


一致性
可以配置为强一致性
取决于产品。一些提供强大的一致性(例如,MongoDB,具有可读取的一致性),而其他提供最终的一致性(例如Cassandra)。

微信扫一扫

第七城市微信公众平台