SQL与NOSQL

发布时间 2023-08-16 09:15:32作者: ywwwik

关系型数据库(SQL):创建在关系模型基础上的数据库,借助集合代数等数学概念和方法处理数据库中的数据
优点:

  • 事务一致性:通过事务处理保持数据的一致性
  • 复杂查询:支持SQL,可以进行JOIN等复杂查询
  • 容易理解:二维表非常贴合现实世界
  • 使用方便:通用的SQL语言使得操作关系型数据库很方便
  • 易于维护:实体完整性、参照完整性和用户定义完整性大大降低了数据冗余,和数据不一致的概率

缺点:

  • 读写性能:在数据量达到一定规模时,由于关系型数据库系统逻辑复杂,为了维护一致性,使得非常容易发生发生死锁等并发问题,导致读写速度下滑严重
  • 表结构更新:表结构可以在被定义之后更新,但是有比较大的结构变化可能会变得十分复杂 高并发:网站并发性非常高,往往达到每秒上万次读写请求,对于
    传统数据库,硬盘IO存在很大瓶颈 海量数据:对于关系型数据库来说,在一张包含海量数据的表中查询,效率非常低

非关系型数据库(NOSQL):是对不同于传统数据库的数据库管理系统的统称

分类:

  1. 面向高性能并发读写的key-value数据库(Redis)
  2. 面向海量数据访问的面向文档数据库(MongoDB)
  3. 面向可扩展性的分布式数据库(HBase)

优点:

  • 读写性能:无需经过sql层解析,读写性能高
  • 简单的扩展:基于键值对,数据没有耦合性,容易扩展
  • 存储格式多:支持key-value形式,文档形式,图片形式,而关系型数据库只支持基础类型
  • 成本低廉:大多数软件都是开源的缺点: 不提供对SQL的支持 支持的特性不够丰富,大多数都不支持sql,BI和报表 现有产品不够成熟

NOSQL常用场景如下:

  • 数据库表字段经常变化
    比如在线商城,维护产品的属性经常要增加字段,这就意味着 ORMapping 层的代码和配置要改,如果该表的数据量过百万,新增字段会带来额外开销(重建索引等)。

  • 数据库字段是复杂数据类型
    对于复杂数据类型,比如 SQL Sever 提供了可扩展性的支持,像 xml 类型的字段。DB 层对 xml 字段很难建高效索引,应用层又要做从字符流到 dom 的解析转换。NoSQL 以 json 方式存储,提供了原生态的支持,在效率方便远远高于传统关系型数据库。
  • 高并发数据库请求
    此类应用常见于 web2.0 的网站,很多应用对于数据一致性要求很低,而关系型数据库的事务以及大表 JOIN 反而成了”性能杀手”。
  • 海量数据的分布式存储
    海量数据的存储如果选用大型商用数据,如 Oracle,那么整个解决方案的成本是非常高的,要花很多钱在软硬件上。NoSQL 分布式存储,可以部署在廉价的硬件上,是一个性价比非常高的解决方案。

NOSQL与SQL相结合:
由于关系型数据库和非关系型数据库不同的优缺点,可以在不同要求下选择使用两种数据库。可以说,NoSQL 数据库是关系数据库在某些方面(性能,扩展)的一个弥补。

举个简单的例子吧,比如用户评论的存储,评论有主键 id、评论的对象 aid、评论内容 content、用户 uid 等字段。我们能确定的是评论内容 content 肯定不会在数据库中用 where content=’’ 查询,评论内容也是一个大文本字段。那么我们可以把主键 id、评论对象 aid、用户 id 存储在数据库,评论内容存储在 NoSQL,这样数据库就节省了存储 content 占用的磁盘空间,从而节省大量 IO,对 content 也更容易做 Cache。

另外,可使用 NoSQL 作为缓存服务器。MySQL + Memcached 的架构中,Memcached 这类内存缓存服务器缓存的数据大小受限于内存大小,如果用 NoSQL 来代替 Memcached 来缓存数据库的话,就可以不再受限于内存大小。虽然可能有少量的磁盘IO读写,可能比 Memcached 慢一点,但是完全可以用来缓存数据库的查询操作。总之,要根据具体需求选择使用哪种数据库。