一、什么是非关系型数据库
非关系型数据库(NoSQL数据库)是指不使用关系型数据表格进行存储和访问数据的数据库技术。(非关系型数据库的数据存储方式更加灵活,主要弥补了关系型数据库在大规模分布式存储上的不足。)
非关系型数据库,一般不遵循 ACID(原子性、一致性、隔离性和持久性)规则,采用 CAP(一致性、可用性和分区容错性)原则为设计目标,强调数据分区,不支持联结操作,一般没有固定模式(Schema),灵活易变。
二、非关系型数据库的分类
2.1基于键值的数据库
基于键值存储,相当于一个大的doctionary,可以通过key直接获得value。这种数据库的典型应用场景是缓存,少量数据的查询。
典型的应用案例如Redis
#向key为foo的键中设置值为bar
SET foo bar
#获取key为foo的值
GET foo
#获取键的数量
DBSIZE
2.2基于文档的数据库
非关系型数据库的又一类基于文档(document)存储的,MongoDB就是很好的例子。相当于非结构化数据存储,文档中唯一的约束条件就是这是一个json文件。
典型的应用案例如Mongodb
#插入一个文档数据
db.my_collection.save({author:'linyize', status:'ok'})
#修改一个文档数据
db.my_collection.update({author:'linyize', status:'ok'},{$set:{status:'failed'}})
#获取一个文档数据
db.my_collection.findOne({author:'linyize'})
2.3列式数据库
列式数据库的核心特点是基于列(Column)存储而非基于行进行存储的。相对于关系型(基于行存储)数据库来说,列式数据库可以很好地优化 OLAP (联机分析处理)的性能。
优点:
如若不关心具体是哪些行或者说只需要知道某一行的某一列,就无需把整个行的信息都取出来,这样非常有效地压缩了数据存储量;
与存储方式的优化搭配,列式数据库一般使用更加高效的压缩方式,这样的话,我们就可以对 reclaimed datas在大规模列式数据存储中进行非常优秀的控制。
典型应用案例如Hbase
#创建表
create 'table_name', 'family_name'
#create 'info', 'dp'
#通过参数bloomfilter去设置存储于集群中的数据是否使用Bloom过滤器。
create 'weather', 'data', SPLITS => ['S', 'T', 'W', 'Z']
#插入一条数据记录
put 'table_name', 'rowkey1', 'family_name:clumn_name1', 'value1'
put 'weather', '20150101', 'data:LSOD', '48'
#按RowKey精确查询
getRow
#按在一个范围行键范围内查询,这个在应用层面非常常见,比如按某个用户特定的时间群或者是某个地域、某个二维坐标区域内所有数据。
getScanner
#统计模块
aggregation
2.4图形数据库
图形数据库的使用场景是处理大量的图数据,它可以非常快速地进行网络分析、推荐系统、欺诈检测等一些复杂的问题处理,特别是对于那些大规模、动态、半结构化等特征的网络数据,比如社交网络、网络信息流、问答社区等。
典型应用案例如neo4j、GraphDB
## 基于Cypher查询语言的一个举例
#创建节点
CREATE (movie:Movie {title: 'The Matrix', year: 1999, tagline: 'Welcome to the Real World'})
#新建关系
CREATE (movie)-[:DIRECTED_BY]->(:Person {name: 'Wachowski brothers'})
#查询语言
MATCH (movie:Movie {title: 'The Matrix'}) <-[:DIRECTED_BY]-() <-[:ACTED_IN]-() RETURN movie.title
2.5搜索引擎类数据库
这种数据库的应用场景是处理大量非结构化数据,特别是针对一些复杂的全文搜索和,如搜索引擎、博客、RSS等处理,它利用倒排索引存储数据。
典型应用案例如ElasticSearch、Solr等
#通过Postman工具进行API接口请求
GET http://127.0.0.1:9200/_cat/health?v
PUT http://127.0.0.1:9200/blog/article/1
#新建索引
PUT http://127.0.0.1:9200/blog/
#添加mapping信息
PUT http://127.0.0.1:9200/blog/article/_mapping
#查询
GET http://127.0.0.1:9200/blog/article/_search?q=title:ElasticSearch
三、键-值存储数据库的选型及技术难点
3.1选型
通常用于存储结构不复杂的的资源,适用于缓存,会话存储,持久化存储等应用场景。
推荐选型:
Redis:基于键值对保存数据,支持多种数据类型操作(比如字符串,哈希,列表,集合,有序集合等),支持丰富的数据管理操作,并且可以通过主从架构,Cluster集群方式等提升数据库可靠性及查询性能;
Memcache:只有字符串类型的数据,存储和操作简便,读写效率高,缓存一般都采用Memcached技术。
3.2技术难点
键-值存储数据库系统的技术难点主要包括:
数据结构与类型系统:Redis支持string、hash、list、set、zset五种数据结构;而BerkeleyDB采用的是B+树。
数据存储与读写优化:因为键-值存储数据库设计简单,大部分直接使用内存存储数据,且只支持最基本的数据结构,所以存储和读写性能相对较高。
数据并发与事务控制:分布式环境下的并发性能是非常重要的,主要包括锁机制、分布式事务等,这些都是对数据并发的解决方案。
内存及磁盘管理和维护:为了保证高效的内存使用、数据压缩存储、以及数据可靠性,对Redis等键-值存储数据库进行合适的存储与管理的方案是必须的。
四、非关系型数据库的优缺点以及适用场景
4.1优点
高性能和可扩展性:非关系型数据库采用的基础数据结构非常简洁,存储数据非常压缩,读取速度非常快,扩展能力非常强大,特别适合进行大数据分析、高并发处理等。
面向对象思想和多数据中心系统:NoSQL具备松散的数据模型和简单的API,非常方便面向对象编程开发;由于其基于分布式底层架构设计,多数据中心复制数据也更为容易实现。
免费和开源:很多基于非关系型数据库的开源项目提供的软件都是免费的,可大大降低了项目的运行成本。
4.2缺点
不支持原子性:非关系型数据库不遵循ACID规则,不能保证原子性。
建模灵活但不稳定:NoSQL数据库的设计非常灵活,但这种灵活性也会造成数据不够稳定,需要更多的维护和调整。
缺少标准化:由于非关系型数据库是相对较新的技术,没有像SQL和其它关系型数据库那样的标准化,因此是以各自不同的方式进行数据库的设计及实现。
4.3适用场景
大规模的复杂查询和数据分析:NoSQL数据库相比于关系型数据库,适合于海量数据的处理和管理。
高并发:尤其适用于高并发、读写比例高的应用,如即时消息、游戏等。
实时性要求:NoSQL数据库非常适合数据实时的处理和分析,如监控系统等。
总结
通过以上对非关系型数据库的分类、键值数据库的选型和技术难点、非关系型数据库的优缺点及适用场景做些总结,可以看出,非关系型数据库的特点是灵活的数据结构和分布式系统架构,使它们可以高效地处理大量非结构化(或半结构化)数据。因此,在大规模分布式云计算、千万级别的用户量、大数据存储、实时在线监控等需求方面极具优势。当然,相对于传统的关系型数据库,非关系型数据库还存在不足之处,如果你的应用场景是对数据完整性、数据一致性有极高要求的,或需要SQL语言支持的繁琐写法,那可能会是非关系型数据库的短板。