非关系型数据库有很多,例如redis、hbase、mogodb、neo4J等,导致很多人搞不清楚什么场景用什么样的非关系型数据库。
本期,我们就来聊一下非关系型数据库,介绍非关系型数据库的类型分类以及各应用场景。
非关系型数据库是相对表格形式的数据库(MySQL、Oracle)而言的,简单地说,只要不是表格形式的数据库都可以称为非关系型数据库(NoSQL)。
为什么需要使用非关系型数据库
那么我们先讨论一个问题,理论上数据库(MySQL、Oracle)就能满足所有的业务需求了,为什么还需要非关系型数据库呢?
主要有两个原因:
性能问题,如果数据读写都完全依赖数据库的话,网站系统的性能会很差
业务场景受限,数据库受限于表格形式的局限,在一些如好友关系等关系复杂的数据场景下是乏力的
非关系型数据库的分类
非关系型数据库虽然有很多具体软件,但是按照存储类型分的话,只有4类,下面也将对其分别介绍。
键值存储非关系型数据库,如Redis、Memcache等;
列存储非关系型数据库,如HBase、Cassandra等;
文档型非关系型数据库,如MongoDB、CouchDB等;
图形非关系型数据库,如Neo4J、InfoGrid等。
键值存储型非关系型数据库
其存储的数据形式一般是键值对(Key-Value),如Redis、Memcache等。
就数据的存储形式(Key-Valve)而言,确实无特别之处,MySQL完全可以胜任这样的数据储。
但这类型非关系型数据库一般也是内存型数据库(如Redis、Memcache等),也就是它们的数据都存在内存当中,磁盘存储一般只作为备份(部分不支持磁盘备份)。
这里我们以比较流行的Redis展开讨论,Redis的数据存储在内存当中,数据操作直接对内存进行操作,所以它的性能非常高,大概1秒能处理10万请求(性能调优后)。
Redis的优势在于其性能上,所以一般作为降低MySQL等数据库压力的主要手段,如降低数据库的读频率、降低数据库的写频率等缓存机制。
这类缓存机制让网站系统的性能有明显的提高,几乎是每个大型网站系统必备的,缓存机制的具体实现后续将会出专门的一期内容介绍。
列存储非关系型数据库
列存储非关系型数据库,例如HBase、Cassandra等。
与MySQL等数据库的区别是:MySQL等数据库是按行存储的,HBase等列存储非关系型数据库是按列存储的。
按列存储数据的方式有两个好处:
高效的存储空间利用率,由于一列内的数据的业务类型是一致的,理论存在很多相同的数据,以列存储数据可以更高效地压缩数据;例如某列数据存的是身高数据,则相同的数据,如cm都可以进行压缩。
当搜索条件较少时,查询效率高,因为数据是按列存储的,可以通过指定列数据快速获取数据所在的位置。例如,“获取李四的身高”这个查询,查询过程不需要遍历所有的数据,在“姓名列”中找到张三处在第二行,然后在“身高列”直接获取第二行数据则为“李四的身高”。
以上列存储非关系型数据库的优点只有在海量数据的前提下才会显现出来。
另外,一般列存储非关系型数据库不适合随机更新(更新的消耗较大),不支持事务回滚。
所以,列存储非关系型数据库一般只适合存储一些数据量大、几乎不更新、查询时条件较少的数据,如用户画像数据、聊天记录等。
文档型非关系型数据库
文档型非关系型数据库,如MongoDB、CouchDB等。
这里的文档并不是文件,而是一种半结构化的数据,如Json、xml等数据。
由于文档型非关系型数据库支持存储Json等格式的数据,所以在数据结构上非常灵活。但是,大多数文档型非关系型数据库都不支持事务,而且不支持复杂查询。
所以,文档型非关系型数据库适合存储量很大(或以后会变得很大)、具体结构不明确(字段需要不断调整)的数据。
另外,之前在网上看到过这样的说法MongoDB是分布式数据库,支持无限扩展,是大型网站必备的。
但实际上,如果用MongoDB完全替代MySQL的话,大部分业务功能的实现上将会变得十分复杂,得不偿失这也说明一个道理,合适的技术才是最好的技术。
图形非关系型数据库
图形非关系型数据库,这里的图形并不是图片,而是图数据结构。图形非关系型数据库如Neo4J、InfoGrid等。
以好友关系为例,理论上MySQL也可以存储但是随着用户基数越来越多,则好友关系会越来越复杂。
所以,在存储数据量大,且关系复杂的数据时,如社交好友关系等数据一般用图形非关系型数据库。
总结
以上就是非关系型数据库的相关介绍。
非关系型数据库与关系型数据库(MySQL等)之间,多个非关系型数据库之间,都并不是排他的关系,而是相辅相成的关系。
当然,我们只从数据结构上对非关系型数据库进行分类,而具体选择哪个非关系型数据库,更多的是根据具体功能场景、某些特殊要求而定。
如同时文档型非关系型数据库,如果是数据管理,则MongoDB更合适,如果是数据检索,则ElasticSearch更合适。
后续,随着介绍某些特殊机制(如缓存机制、全文检索等)。我们会更加深入地介绍相关的非关系型数据库。
最后,我们想明确一个观念,并不是使用了Redis、MongoDB、Neo4J等软件就是先进的系统,胡乱堆砌这些软件只会让系统变得糟糕。按需要合理地使用这些软件才会让系统质量更高,而非一些无关紧要的原因而盲目使用。