MongoDB 之类的 NoSQL 与关系型数据库相比,各有什么优缺点及适用场景?
MongoDB推崇的哲学史:yourdataisschema.意思是,你想要的数据是什么样子,存在数据库里的就是什么样子。意思是,大多数时候,不用你去分table,然后查询的时候再Join意思是,你不用去处理复杂的关系MongoDB的Atomicity是基于单个文档的,在多文档的时候,会稍微麻烦一点。
私以为,简单地说传统数据库与NoSQL相比核心的弱势在于1)集中式单点架构:数据模型僵硬、可扩展性差2)固定数据模型:缺乏处理半结构和非结构化数据的能力3)扩容成本高:处理海量数据时存在性能瓶颈,大数据时代的存储需求下,成本指数上涨并不是说NewSQL/NoSQL就可以完全替代关系型数据库,但超过70%的现有关系型数据库场景其实是可以用NoSQL替代的。关系型数据库的核心优势在于强一致性的关系模型,当人们发现并不是所有的数据都要求那么强的一致性,同时对于性能和数据量的需求越来越高时,NoSQL应运而生了。NoSQL主要将可扩展性放在首位,而高可用或一致性则放到了第二位,这种设计与原本的关系模型产生了极大的差异。之后,随着企业级应用于大数据技术的不断融合碰撞,在分布式的NoSQL基础上,结合分布式SQL和一定的OLTP的支持,出现了新一代的NewSQL数据库。也就是:SQL/OLTP+NoSQL分布式存储拿自家产品Sequoiadb巨杉数据库来说,不仅支持标准SQL,还支持事务。具体来说,分布式存储:巨杉数据库使用完全的分布式的架构,同时存储格式也使用的JSON文档型数据存储方式,这就使得数据库的适应面更广。既可以描述关系型结构,最大限度保留现有的应用资产;也可以描述非关系型结构,可以把非结构化的文件和结构化的描述项一起存储,而不是索引+文件存储;适当降低范式维度,减少复杂的JOIN操作。OLTP与SQL:除了分布式存储,巨杉数据库拥有分布式SQL引擎,完善的SQL支持,包括高并发、低延时和批量计算SQL能力;提供ACID和事务支持。
经常会有客户问我MongoDB的特点和使用场景,以及如何平滑迁移到云端,我正好总结了下,就mongodb而言谈谈我的看法。MongoDB的特点和适用场景实用性MongoDB是一个面向文档的数据库,它并不是关系型数据库,直接存取BSON,这意味着MongoDB更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的key和value不是固定的数据类型和大小,所以开发者在使用MongoDB时无须预定义关系型数据库中的”表”等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。可用性和负载均衡MongoDB在高可用和读负载均衡上的实现非常简洁和友好,MongoDB自带了副本集的概念,通过设计适合自己业务的副本集和驱动程序,可以非常有效和方便地实现高可用,读负载均衡。而在其他数据库产品中想实现以上功能,往往需要额外安装复杂的中间件,大大提升了系统复杂度,故障排查难度和运维成本。扩展性在扩展性方面,假设应用数据增长非常迅猛的话,通过不断地添加磁盘容量和内存容量往往是不现实的,而手工的分库分表又会带来非常繁重的工作量和技术复杂度。在扩展性上,MongoDB有非常有效的,现成的解决方案。通过自带的Mongos集群,只需要在适当的时候继续添加Mongo分片,就可以实现程序段自动水平扩展和路由,一方面缓解单个节点的读写压力,另外一方面可有效地均衡磁盘容量的使用情况。整个mongos集群对应用层完全透明,并可完美地做到各个Mongos集群组件的高可用性。数据压缩自从MongoDB3.0推出以后,MongoDB引入了一个高性能的存储引擎WiredTiger,并且它在数据压缩性能上得到了极大的提升,跟之前的MMAP引擎相比,压缩比至少可增加5倍以上,可以极大地改善磁盘空间使用率。其他特性相比其他关系型数据库,MongoDB引入了”固定集合”的概念。所谓固定集合,就是指整个集合的大小是预先定义并固定的,内部就是一个循环队列,假如集合满了,MongoDB后台会自动去清理旧数据,并且由于每次都是写入固定空间,可大大地提升写入速度。这个特性就非常适用于日志型应用,不用再去纠结日志疯狂增长的清理措施和写入效率问题。另外需要更加精细的淘汰策略设置,还可以使用TTL索引(time-to-liveindex),即具有生命周期的索引,它允许为每条记录设置一个过期时间,当某条记录达到它的设置条件时可被自动删除。在某些LBS的应用中,使用MongoDB也有非常巨大的优势。MongoDB支持多种类型的地理空间索引,支持多种不同类型的地理空间查询,比如intersection,within和nearness等。MongoDB不适用的应用场景在某些场景下,MongoDB作为一个非关系型数据库有其局限性。MongoDB不支持事务操作,所以需要用到事务的应用建议不用MongoDB,另外MongoDB目前不支持join操作,需要复杂查询的应用也不建议使用MongoDB。
理解ACID与BASE的区别(ACID是关系型数据库强一致性的四个要求,而BASE是NoSQL数据库通常对可用性及一致性的弱要求原则,它们的意思分别是,ACID:atomicity,consistency,isolation,durability;BASE:BasicallyAvailable,Soft-state,EventuallyConsistent。同时有意思的是ACID在英语里意为酸,BASE意思为碱)理解持久化与非持久化的区别。这么说是因为有的NoSQL系统是纯内存存储的。你必须意识到传统有关系型数据库与NoSQL系统在数据结构上的本质区别。传统关系型数据库通常是基于行的表格型存储,而NoSQL系统包括了列式存储(Cassandra)、key/value存储(Memcached)、文档型存储(CouchDB)以及图结构存储(Neo4j)与传统关系数据库有统一的SQL语言操作接口不同,NoSQL系统通常有自己特有的API接口。在架构上,你必须搞清楚,NoSQL系统是被设计用于成百上千台机器的集群中的,而非共享型数据库系统的架构。在NoSQL系统中,可能你得习惯一下不知道你的数据具体存在何处的情况。在NoSQL系统中,你最好习惯它的弱一致性。”eventuallyconsistent”(最终一致性)正是BASE原则中的重要一项。比如在Twitter,你在Followers列表中经常会感受到数据的延迟。在NoSQL系统中,你要理解,很多时候数据并不总是可用的。你得理解,有的方案是拥有分区容忍性的,有的方案不一定有。
回答请先登录