NoSQL非关系型数据库
NoSQL非关系型数据库有哪些?
非关系型数据库,大的分类有四种类型。
1. 键值数据库
键值数据库起源于 Amazon 开发的 Dynamo 系统,可以把它理解为一个分布式的 Hashmap,支持 SET/GET 元操作。
它使用一个哈希表,表中的 Key(键)用来定位 Value(值),即存储和检索具体的 Value。
数据库不能对 Value 进行索引和查询,只能通过 Key 进行查询。Value 可以用来存储任意类型的数据,包括整型、字符型、数组、对象等。
如图 所示。键值存储的值也可以是比较复杂的结构,如一个新的键值对封装成的一个对象。
一个完整的分布式键值数据库会将 Key 按策略尽量均匀地散列在不同的结点上,其中,一致性哈希函数是比较优雅的散列策略,它可以保证当某个结点挂掉时,只有该结点的数据需要重新散列。
在存在大量写操作的情况下,键值数据库可以比关系数据库有明显的性能优势,这是因为关系型数据库需要建立索引来加速查询,当存在大量写操作时,索引会发生频繁更新,从而会产生高昂的索引维护代价。键值数据库具有良好的伸缩性,理论上讲可以实现数据量的无限扩容。
键值数据库可以进一步划分为内存键值数据库和持久化键值数据库。
内存键值数据库把数据保存在内存中,如 Memcached 和 Redis。
持久化键值数据库把数据保存在磁盘中,如 BerkeleyDB、Voldmort 和 Riak。
键值数据库也有自身的局限性,主要是条件查询。
如果只对部分值进行查询或更新,效率会比较低下。在使用键值数据库时,应该尽量避免多表关联查询。此外,键值数据库在发生故障时不支持回滚操作,所以无法支持事务。
大多数键值数据库通常不会关心存入的 Value 到底是什么,在它看来,那只是一堆字节而已,所以开发者也无法通过 Value 的某些属性来获取整个 Value。
2. 列式数据库
列式数据库起源于 Google 的 BigTable,其数据模型可以看作是一个每行列数可变的数据表, 它可以细分为 4 种实现模式
列式数据库模型
其中,Super Column Family 模式可以理解为 maps of maps,例如,可以把一个作者和他的专辑结构化地存成 Super Column Family 模式
文档数据库
文档数据库是通过键来定位一个文档的,所以是键值数据库的一种衍生品。在文档数据库中,文档是数据库的小单位。文档数据库可以使用模式来指定某个文档结构。
文档数据库是 NoSQL 数据库类型中出现得自然的类型,因为它们是按照日常文档的存储来设计的,并且允许对这些数据进行复杂的查询和计算。
尽管每一种文档数据库的部署各有不同,但是大都假定文档以某种标准化格式进行封装,并对数据进行加密。
文档格式包括 XML、YAML、JSON 和 BSON 等,也可以使用二进制格式,如 PDF、Microsoft Office 文档等。一个文档可以包含复杂的数据结构,并且不需要采用特定的数据模式,每个文档可以具有完全不同的结构。
文档数据库既可以根据键来构建索引,也可以基于文档内容来构建索引。基于文档内容的索引和查询能力是文档数据库不同于键值数据库的主要方面,因为在键值数据库中,值对数据库是透明不可见的,不能基于值构建索引。
文档数据库主要用于存储和检索文档数据,非常适合那些把输入数据表示成文档的应用。从关系型数据库存储方式的角度来看,每一个事物都应该存储一次,并且通过外键进行连接,而文件存储不关心规范化,只要数据存储在一个有意义的结构中就可以。
如图 7 所示,如果我们要将报纸或杂志中的文章存储到关系型数据库中,首先我们要对存储的信息进行分类,即将文章放在一个表中,作者和相关信息放在一个表中,文章评论放在一个表中,读者信息放在一个表中,然后将这四个表连接起来进行查询。
图形数据库
图形数据库以图论为基础,用图来表示一个对象集合,包括顶点及连接顶点的边。图形数据库使用图作为数据模型来存储数据,可以高效地存储不同顶点之间的关系。
图形数据库是 NoSQL 数据库类型中复杂的一个,旨在以高效的方式存储实体之间的关系。
图形数据库适用于高度相互关联的数据,可以高效地处理实体间的关系,尤其适合于社交网络、依赖分析、模式识别、推荐系统、路径寻找、科学论文引用,以及资本资产集群等场景。
图形数据库在处理实体间的关系时具有很好的性能,但是在其他应用领域,其性能不如其他 NoSQL 数据库。
典型的图形数据库有 Neo4J、OrientDB、InfoGrid、Infinite Graph 和 GraphDB 等。有些图形数据库,如 Neo4J,完全兼容 ACID 特性。
NoSQL 的起因:
NoSQL(Not only SQL)泛指非关系型数据库。随着 Web 2.0 网站的兴起,传统的关系数据库已经无法适应 Web 2.0 网站,特别是超大规模和高并发的社交类型的 Web 2.0 纯动态网站,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
NoSQL 数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
1. 无法满足对海量数据的高效率存储和访问的需求
Web 2.0 网站要根据用户个性化信息来实时生成动态页面和提供动态信息,基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要处理每秒上万次的读写请求。
关系型数据库处理上万次 SQL 查询已经很困难了,要处理上万次 SQL 写数据请求,硬盘 I/O 实在无法承受。
另外,在大型的社交网站中,用户每天产生海量的动态数据,关系型数据库难以存储这么大量的半结构化数据。在一张上亿条记录的表里面进行 SQL 查询,效率会非常低甚至是不可忍受的。
2. 无法满足对数据库的高可扩展性和高可用性的需求
在基于 Web 的架构当中,数据库是难进行横向扩展的,当一个应用系统的用户量和访问量与日倶增时,数据库无法像 Web 服务器那样简单地通过添加更多的硬件和服务器结点来扩展性能和负载能力。
3. 关系数据库无法存储和处理半结构化/非结构化数据
现在开发者可以通过 Facebook、腾讯和阿里等第三方网站获取与访问数据,如个人用户信息、地理位置数据、社交图谱、用户产生的内容、机器日志数据及传感器生成的数据等。
对这些数据的使用正在快速改变着通信、购物、广告、娱乐及关系管理的特质。开发者希望使用非常灵活的数据库,轻松容纳新的数据类型,并且不会被第三方数据提供商内容结构的变化所限制。很多新数据都是非结构化或是半结构化的,因此开发者还需要能够高效存储这种数据的数据库。
但是,关系型数据库所使用的定义严格、基于模式的方式是无法快速容纳新的数据类型的,对于非结构化或是半结构化的数据更是无能为力。
NoSQL 提供的数据模型则能很好地满足这种需求。很多应用都会从这种非结构化数据模型中获益,如 CRM(客户关系管理)、ERP(企业资源平台)、BPM(业务流程管理) 等,它们可以通过这种灵活性存储数据而无须修改表或是创建更多的列。
4. 关系数据库的事务特性对 Web 2.0 是不必要的
关系数据库对数据库事务一致性需求很强。
插入一条数据之后立刻查询,肯定可以读出这条数据。
很多 Web 实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。
所以,对于 Web 系统来讲,就没有必要像关系数据库那样实现复杂的事务机制,从而可以降低系统开销,提高系统效率。
5. Web 2.0 无须进行复杂的 SQL 查询,特别是多表关联查询
复杂的 SQL 查询通常包含多表连接操作,该类操作代价高昂。但是,社交类型的网站,往往更多的是单表的主键查询,以及单表的简单条件分页查询,SQL 的功能被极大地弱化了。
因此,Web 2.0 时代的各类网站的数据管理需求已经与传统企业应用大不相同,关系数据库很难满足新时期的需求,于是 NoSQL 数据库应运而生。
NoSQL 的特点:
关系型数据库中的表都是存储一些格式化的数据结构,每个元组字段的组成都一样,即使不是每个元组都需要所有的字段,但数据库会为每个元组分配所有的字段,这样的结构可以便于表与表之间进行连接等操作。但从另一个角度来说,它也是关系型数据库性能瓶颈的一个因素。
NoSQL 是一种不同于关系型数据库的数据库管理系统设计方式,是对非关系型数据库的统称。它所采用的数据模型并非关系型数据库的关系模型,而是类似键值、列簇、文档等的数据模型。它打破了长久以来关系型数据库与 ACID(原子性(Atomicity)、一致性(Consistency)隔离性(Isolation)和持久性(Durability))理论大一统的局面。
NoSQL 数据存储不需要固定的表结构,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。
NoSQL 在大数据存取上具备关系型数据库无法比拟的性能优势。
1. 灵活的可扩展性
多年来,数据库负载需要增加时,只能依赖于纵向扩展,也就是买更强的服务器,而不是依赖横向扩展将数据库分布在多台主机上。
NoSQL 在数据设计上就是要能够透明地利用新结点进行扩展。
NoSQL 数据库种类繁多,但是一个共同的特点是都去掉了关系型数据库的关系型裝性。
数据之间无关系,非常容易扩展,从而也在架构层面上带来了可横向扩展的能力。
2. 大数据量和高性能
大数据时代被存储的数据的规模极大地增加了。尽管关系型数据库系统的能力也在为适应这种增长而提高,但是其实际能管理的数据规模已经无法满足一些企业的需求。
而 NoSQL 数据库具有非常高的读写性能,尤其在大数据量下,能够同样保持高性能,这主要得益于 NoSQL 数据库的无关系性。
3. 灵活的数据模型,可以处理半结构化/非结构化的大数据
对于大型的生产性的关系型数据库来讲,变更数据模型是一件很困难的事情。即使只对一个数据模型做很小的改动,也许就需要停机或降低服务水平。
NoSQL 数据库在数据模型约束方面更加宽松,无须事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
NoSQL 数据库可以让应用程序在一个数据元素里存储任何结构的数据,包括半结构化/非结构化数据。
相关文章