关系型数据库与⾮关系型数据库的对⽐分析(优缺点,应⽤,
区别等)
sql容易学吗当前主流的关系型有、DB2、Microsoft SQL Server、Microsoft Access、等。
⾮关系型数据库有 NoSql、Cloudant。
==========================优缺点分析如下=============================================== nosql和关系型数据库⽐较?
优点:
1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使⽤oracle那样花费⼤量成本购买使⽤,相⽐关系型数据库价格便宜。2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,⾃然查询速度远不及nosql数据库。
3)存储数据的格式:nosql的存储格式是key,value形式、⽂档形式、图⽚形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,⽽数据库则只⽀持基础类型。
4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。
缺点:
1)维护的⼯具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10⼏年的技术同⽇⽽语。
2)不提供对sql的⽀持,如果不⽀持sql这样的⼯业标准,将产⽣⼀定⽤户的学习和使⽤成本。
3)不提供关系型数据库对事物的处理。
⾮关系型数据库与关系型数据库各⾃的优势
⾮关系型数据库的优势:
1. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,⽽且不需要经过SQL层的解析,所以性能⾮常⾼。
2. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以⾮常容易⽔平扩展。
关系型数据库的优势:
1. 复杂查询可以⽤SQL语句⽅便的在⼀个表以及多个表之间做⾮常复杂的数据查询。
2. 事务⽀持使得对于安全性能很⾼的数据访问要求得以实现。对于这两类数据库,对⽅的优势就是⾃⼰的弱势,反之亦然。
⾮关系型数据库的优势和劣势
关系型数据库把所有的数据都通过⾏和列的⼆元表现形式表⽰出来。
关系型数据库的优势:
1. 保持数据的⼀致性(事务处理)
2.由于以标准化为前提,数据更新的开销很⼩(相同的字段基本上都只有⼀处)
3. 可以进⾏Join等复杂查询
其中能够保持数据的⼀致性是关系型数据库的最⼤优势。
关系型数据库的不⾜:
不擅长的处理
1. ⼤量数据的写⼊处理
2. 为有数据更新的表做索引或表结构(schema)变更
3. 字段不固定时应⽤
4. 对简单查询需要快速返回结果的处理
=========================区别如下==============================================
区别的总结:
⾸先⼀般⾮关系型数据库是基于CAP模型,⽽传统的关系型数据库是基于ACID模型的
1. 数据存储结构:
⾸先关系型数据库⼀般都有固定的表结构,并且需要通过DDL语句来修改表结构,不是很容易进⾏扩展,⽽⾮关系型数据库的存储机制就有很多了,⽐如基于⽂档的,K-V键值对的,还有基于图的等,对于数据的格式⼗分灵活没有固定的表结构,⽅便扩展,因此如果业务的数据结构并不是固定的或者经常变动⽐较⼤的,那么⾮关系型数据库是个好的选择
2. 可扩展性
传统的关系型数据库给⼈⼀种横向扩展难,不好对数据进⾏分⽚等,⽽⼀些⾮关系型数据库则原⽣就⽀持数据的⽔平扩展(⽐如mongodb 的sharding机制),并且这可能也是很多NoSQL的⼀⼤卖点,其实象Mysql这种关系型数据库的⽔平扩展也并不是难,即使NoSQL⽔平扩展容易但对于向跨分⽚进⾏joins这种场景都没有什么太好的解决办法,不管是关系型还是⾮关系型数据库,解决⽔平扩展或者跨分⽚Joins这种场景,在应⽤层和数据库层中间加⼀层中间件来做数据处理也许是个好的办法
3. 数据⼀致性
⾮关系型数据库⼀般强调的是数据最终⼀致性,⽽不没有像ACID⼀样强调数据的强⼀致性,从⾮关系型数据库中读到的有可能还是处于⼀个中间态的数据,因此如果你的业务对于数据的⼀致性要求很⾼,那么⾮关系型数据库并不⼀个很好的选择,⾮关系型数据库可能更多的偏向于OLAP场景,⽽关系型数据库更多偏向于OLTP场景
==============================应⽤部分如下分析===============================================关系型数据库
⼤量数据的写⼊处理
读写集中在⼀个数据库上让数据库不堪重负,⼤部分⽹站已使⽤主从复制技术实现读写分离,以提⾼读写性能和读库的可扩展性。
所以在进⾏⼤量数据操作时,会使⽤数据库主从模式。数据的写⼊由主数据库负责,数据的读⼊由从数据库负责,可以⽐较简单地通过增加从数据库来实现规模化,但是数据的写⼊却完全没有简单的⽅法来解决规模化问题。
第⼀,要想将数据的写⼊规模化,可以考虑把主数据库从⼀台增加到两台,作为互相关联复制的⼆元主数据库使⽤,确实这样可以把每台主数据库的负荷减少⼀半,但是更新处理会发⽣冲突,可能会造成数据的不⼀致,为了避免这样的问题,需要把对每个表的请求分别分配给合适的主数据库来处理。
第⼆,可以考虑把数据库分割开来,分别放在不同的数据库服务器上,⽐如将不同的表放在不同的数据库服务器上,数据库分割可以减少每台数据库服务器上的数据量,以便减少硬盘IO的输⼊、输出处
理,实现内存上的⾼速处理。但是由于分别存储字不同服务器上的表之间⽆法进⾏Join处理,数据库分割的时候就需要预先考虑这些问题,数据库分割之后,如果⼀定要进⾏Join处理,就必须要在程序中进⾏关联,这是⾮常困难的。
--为有数据更新的表做索引或表结构变更
在使⽤关系型数据库时,为了加快查询速度需要创建索引,为了增加必要的字段就⼀定要改变表结构,为了进⾏这些处理,需要对表进⾏共享锁定,这期间数据变更、更新、插⼊、删除等都是⽆法进⾏的。如果需要进⾏⼀些耗时操作,例如为数据量⽐较⼤的表创建索引或是变更其表结构,就需要特别注意,长时间内数据可能⽆法进⾏更新。
--字段不固定时的应⽤
如果字段不固定,利⽤关系型数据库也是⽐较困难的,有⼈会说,需要的时候加个字段就可以了,这样的⽅法也不是不可以,但在实际运⽤中每次都进⾏反复的表结构变更是⾮常痛苦的。你也可以预先设定⼤量的预备字段,但这样的话,时间⼀长很容易弄不清除字段和数据的对应状态,即哪个字段保存有哪些数据。
--对简单查询需要快速返回结果的处理 (这⾥的“简单”指的是没有复杂的查询条件)
这⼀点称不上是缺点,但不管怎样,关系型数据库并不擅长对简单的查询快速返回结果,因为关系型数据库是使⽤专门的sql语⾔进⾏数据读取的,它需要对sql与越南进⾏解析,同时还有对表的锁定和解锁等这样的额外开销,这⾥并不是说关系型数据库的速度太慢,⽽只是想告诉⼤家若希望对简单查询进⾏⾼速处理,则没有必要⾮使⽤关系型数据库不可。
⾮关系型(NoSQL)数据库
关系型数据库应⽤⼴泛,能进⾏事务处理和表连接等复杂查询。相对地,NoSQL数据库只应⽤在特定领域,基本上不进⾏复杂的处理,但它恰恰弥补了之前所列举的关系型数据库的不⾜之处。
优点:
易于数据的分散
各个数据之间存在关联是关系型数据库得名的主要原因,为了进⾏join处理,关系型数据库不得不把数据存储在同⼀个服务器内,这不利于数据的分散,这也是关系型数据库并不擅长⼤数据量的写⼊处理的原因。相反NoSQL数据库原本就不⽀持Join处理,各个数据都是独⽴设计的,很容易把数据分散在多个服务器上,故减少了每个服务器上的数据量,即使要处理⼤量数据的写⼊,也变得更加容易,数据的读⼊操作当然也同样容易。
典型的NoSQL数据库
临时性键值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、⾯向⽂档的数据库(MongoDB、CouchDB)、⾯向列的数据库(Cassandra、HBase)
⼀、 键值存储
它的数据是以键值的形式存储的,虽然它的速度⾮常快,但基本上只能通过键的完全⼀致查询获取数据,根据数据的保存⽅式可以分为临时性、永久性和两者兼具 三种。
(1)临时性
所谓临时性就是数据有可能丢失,memcached把所有数据都保存在内存中,这样保存和读取的速度⾮常快,但是当memcached停⽌时,数据就不存在了。由于数据保存在内存中,所以⽆法操作超出内存容量的数据,旧数据会丢失。总结来说:
。在内存中保存数据
。可以进⾏⾮常快速的保存和读取处理
。数据有可能丢失
(2)永久性
所谓永久性就是数据不会丢失,这⾥的键值存储是把数据保存在硬盘上,与临时性⽐起来,由于必然要发⽣对硬盘的IO操作,所以性能上还是有差距的,但数据不会丢失是它最⼤的优势。总结来说:
。在硬盘上保存数据
。可以进⾏⾮常快速的保存和读取处理(但⽆法与memcached相⽐)
。数据不会丢失
(3) 两者兼备
Redis属于这种类型。Redis有些特殊,临时性和永久性兼具。Redis⾸先把数据保存在内存中,在满⾜特定条件(默认是 15分钟⼀次以上,5分钟内10个以上,1分钟内10000个以上的键发⽣变更)的时候将数据写⼊到硬盘中,这样既确保了内存中数据的处理速度,⼜可以通过写⼊硬盘来保证数据的永久性,这种类型的数据库特别适合处理数组类型的数据。总结来说:
。同时在内存和硬盘上保存数据
。可以进⾏⾮常快速的保存和读取处理
。保存在硬盘上的数据不会消失(可以恢复)
。适合于处理数组类型的数据
⼆、⾯向⽂档的数据库
MongoDB、CouchDB属于这种类型,它们属于NoSQL数据库,但与键值存储相异。
(1)不定义表结构
即使不定义表结构,也可以像定义了表结构⼀样使⽤,还省去了变更表结构的⿇烦。
(2)可以使⽤复杂的查询条件
跟键值存储不同的是,⾯向⽂档的数据库可以通过复杂的查询条件来获取数据,虽然不具备事务处理和Join这些关系型数据库所具有的处理能⼒,但初次以外的其他处理基本上都能实现。
三、 ⾯向列的数据库
Cassandra、HBae、HyperTable属于这种类型,由于近年来数据量出现爆发性增长,这种类型的NoSQL数据库尤其引⼊注⽬。
普通的关系型数据库都是以⾏为单位来存储数据的,擅长以⾏为单位的读⼊处理,⽐如特定条件数据的获取。因此,关系型数据库也被成为⾯向⾏的数据库。相反,⾯向列的数据库是以列为单位来存储数据的,擅长以列为单位读⼊数据。
⾯向列的数据库具有搞扩展性,即使数据增加也不会降低相应的处理速度(特别是写⼊速度),所以
它主要应⽤于需要处理⼤量数据的情况。另外,把它作为批处理程序的存储器来对⼤量数据进⾏更新也是⾮常有⽤的。但由于⾯向列的数据库跟现⾏数据库存储的思维⽅式有很⼤不同,故应⽤起来⼗分困难。
总结:关系型数据库与NoSQL数据库并⾮对⽴⽽是互补的关系,即通常情况下使⽤关系型数据库,在适合使⽤NoSQL的时候使⽤NoSQL 数据库,让NoSQL数据库对关系型数据库的不⾜进⾏弥补。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论