SQL 与 NoSQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25113569/article/details/88168299
SQL 与 NoSQL

概念划分

SQL指关系型数据库,例如:MySQL、SQL Server、Oracle

NoSQL(Not Only SQL)指非关系型数据库。例如:Redis、MongoDB、CouchDB

NoSQL 出现背景

随着互联网的发展:

  • 需要处理的数据量越来越大,单机的存储已经远远的不能满足,需要分布式的存储方案。
  • 对数据的存取速度要求越来越高,快速及时响应是必须的。
  • 用户需要7*24小时的不间断服务,可靠性变得极为重要,必须做好数据层的容错及自动故障迁移。
  • 很多时候数据层需要提供很高的写性能和数据吞吐。比如日志型应用,对写性能要求非常高,当写性能成为瓶颈的时候,提升单机配置并不能解决,所以分布式变得很重要。
  • 互联网领域的应用越来越难像软件开发一样,去预先定义各种数据结构。

关系型数据库优缺点

优点

  • 事务处理保持数据的一致性。
  • 由于以标准化为前提,数据更新的开销很小。
  • 可以进行JOIN等复杂查询。

缺点

  • 扩展困难:由于存在类似JOIN这样的多表查询机制,使得数据库在扩展方面很艰难。
  • 读写慢:这种情况主要发生在数据量达到一定规模时由于关系型数据库的系统逻辑非常复杂,使得其非常容易发生死锁等的并发问题,所以导致其读写速度下滑非常严重。
  • 成本高:企业级数据库的License价格很惊人,并且随着系统的规模而不断上升。
  • 有限的支撑容量:现有关系型数据库解决方案还无法支撑海量的数据存储。

NoSQL 数据库优缺点

优点

  • 简单的扩展:典型例子是Cassandra,由于其架构是类似于经典的P2P,所以能通过轻松地添加新的节点来扩展这个集群。
  • 快速的读写:主要例子有Redis,由于逻辑简单,而且是纯内存操作,使其性能非常出色。
  • 低廉的成本:大多数分布式数据库共有的特点,主要都是开源软件。

缺点

  • 不提供对SQL的支持:如果不支持SQL这样的标准,将会对用户长生一定的学习和迁移成本。
  • 支持的特性不够丰富:现有产品所提供的功能都比较有限,大多数NoSQL数据库都不支持事务,也不想MySQL、SQL Server和Oracale那样能提供各种附加功能,比如BI和报表等。
  • 现有的产品不够成熟:大多数产品还处于初创期,和关系型数据库几十年的完善不可同日而语。

NoSQL 与 SQL区别

SQL 数据库

  • 在使用之前需要定义表的一个模式
  • 在表中存储相关联的数据
  • 支持JOIN多表查询
  • 提供事务
  • 使用一个强声明性语言查询
  • 提供足够的支持,专业技能和工具

NoSQL 数据库

  • 相关联的数据存储类似JSON格式,名称——值
  • 可以保证没有指定格式的数据
  • 保证更新一个文档——但不是多个文档
  • 提供出色的性能和可伸缩性
  • 使用JSON数据对象查询

SQL 与 NoSQL 对比

  • 存储方式

    SQL数据存在特定结构的表中;

    而NoSQL则更加灵活和可扩展,存储方式可以是JSON文档、哈希表或者其他方式。
  • 表/集合数据的关系

    SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键、索引、触发器、存储过程等,表结构可以在被定义之后更新,但是如果有比较大的结构变更的话会变得比较复杂;

    在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。
    NoSQL也可以在数据集中建立索引。以MongoDB为例,会自动在数据集合创建后创建唯一值id字段,这样的话就可以在数据集创建后增加索引。从这点来看,NoSQL可能更适合初始化数据还不够明确或者未定的项目中。
  • 外部数据存储

    SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部的数据表。

    NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方法把外部数据直接放到原数据集中,以提高查询效率。缺点也比较明显,更新数据的时候将会比较麻烦。
  • SQL中的JOIN查询

    SQL中可以使用JOIN表链接方式将多个关系数据库表中的数据用一条简单的查询语句查询出来;

    NoSQL未提供对多个数据集中的数据做查询。
  • 数据耦合性

    SQL中不允许删除已经被使用的外部数据,例如A表中的X已经分配给了Y,那么在A表中将不允许删除X这条数据,以保证数据完整性;

    而NoSQL中则没有这种耦合的概念,可以随时删除任何数据。

NoSQL 适用场景

  1. 数据库表schema经常变化

    比如在线商城,维护产品的属性经常要增加字段,这就一位置ORMapping层的代码和配置要改,如果该表的数据量过百万,新增字段带来额外开销(重建索引等)。NoSQL应用在这种场景,可以极大提升DB的可伸缩性,开发人员可以将更多的精力放在业务层。
  2. 数据库表字段是复杂数据类型

    对于复杂数据类型,比如SQL Server提供了可扩展性的支持,想xml类型的字段。很多用过的人应该知道,该字段不管是查询还是更改,效率非常一般。主要原因是DB层对xml字段很难建立高效索引,应用层又要做从字符流到dom的解析转换。NoSQL以json方式存储,提供了原生态的支持,在效率方面远远高于传统关系型数据库。
  3. 高并发数据库请求

    此类应用常见于web2.0的网站,很多应用对于数据一致性要求很低,而关系型数据库的事务以及大表JOIN反而成了“性能杀手”。在高并发情况下,SQL和NoSQL的性能对比由于环境和角度不同一直是存在争议的,并不是说在任何场景,NoSQL总是会比SQL快。
  4. 海量数据分布式存储

    海量数据的存储如果选用大型商用数据库,如Oracle,那么整个解决方案的成本是非常高的,要花很多钱在软硬件上。NoSQL分布式存储,可以部署在廉价的硬件上,是一个性价比非常高的解决方案。

猜你喜欢

转载自blog.csdn.net/qq_25113569/article/details/88168299