Halo

A magic place for coding

0%

浅谈关系型数据库与非关系型数据库

浅谈关系型数据库与非关系型数据库

  我们经常会接触到各种类型的数据库,比较出名的是MySQL、NoSQL,还有Redis算不算数据库呢?什么是关系型数据库,什么又是非关系型数据库?它们之间有什么区别呢?优缺点分别又是什么?


什么是关系型数据库

  关系型数据库,是指采用了关系模型来组织数据的数据库。那关系模型又是什么?简单地理解,关系模型指的就是二维表格模型,也就是对应一张table。

  • 经典代表:MySQL

优点

  • 易于理解:二维表格模型贴近人的理解逻辑,相比于网状结构、层级结构,拥有更低的理解成本。
  • 操作方便:关系型数据库基本支持通用的SQL语言
  • 易于维护:丰富的完整性,包括实体完整性、参照完整性、用户定义的完整性,这大大减低了数据冗余和数据不一致的概率

缺点

  • 高并发场景下的IO瓶颈:当数据库面临大量的IO请求时,数据库需要在磁盘与内存间进行大量的换页操作,开销很大。
  • 读写效率:对于一张包含海量数据的表格,查询效率非常低(就算用了索引效率也会很低)。
  • 扩展性:关系型数据库的横向扩展是非常困难的。有人说增加磁盘就好了,但是增加磁盘会导致数据分散开来,对于表之间的关联查询性能会有很严重的影响。目前的解决方法是sharding(垂直分片或水平分片)。

关系型数据库的现状

  结合上面提到的关系型数据库的优缺点,以及当下业界对关系型数据库的使用情况,关系型数据库很多特性实际上已经很少被使用:

  1. 事务一致性:关系型数据库在维护事务一致性中开销很大,而现在很多业务都将数据库的读写操作解耦,减少事务的使用。
  2. 读写实时性:关系型数据库是保证读写的实时性的,即在数据库插入或更新一条记录后,是一定能够读取到这条最新的记录的。但是在实际场景中,用户是可以一定程度上容忍这种非实时性的,比如我在微信上发送一条聊天记录,接收方是可以容忍在几秒甚至几十秒后收到这条记录的。
  3. 关联查询:关系型数据库强大之处在于它支持SQL语句的查询,SQL提供丰富的查询功能,尤其是关联查询。因为通过关联查询我们能够找到不同实体之间的联系。然而在现代的软件工程中,会尽量避免多个大表的关联查询,因为关联查询极大地降低数据库的性能,取而代之的往往是单表的主键查询,因此SQL的功能极大的弱化了。

出于对以上几点的考虑,非关系型数据库应运而生,非常受FaceBook、Google这类公司的欢迎。


非关系型数据库

  前面提到,关系型数据库的特点就是数据的存储是按照二维表格的形式。而非关系型数据库则是要突破这种表格的形式,使用键值对存储,value的结构是不固定的。

优点

  1. 用户可以添加自己需要的字段,每个value都可以有自己的数据结构类型,而不需要统一;
  2. 以key-value的方式存储,对于按key的查询操作是非常高效率的;
  3. 高扩展性及高可用性。key-value这种结构很容易进行扩展,方便扩展及迁移带来的就是高可用性。

缺点

  1. 不能够提供SQL完整的查询体系,如使用where语句对value值得查询则不支持。
  2. 对于较为复杂的关系,key-value的存储方式比较难体现。

分类

  1. 面向高并发读写操作的key-value数据库:这类数据库支持高并发的读写操作,经典代表有Redis(redis详解)、Cabinet。
  2. 面向海量数据访问的数据库:这类数据库支持在海量数据中进行查询操作,经典代表有MongoDB

总结

  总而言之,关系型数据库和非关系型数据两者并不是孰优孰劣的关系,而是要视乎使用场景而决定使用哪一个。关系型数据库的完整一致性和支持事务的特点比较适合于存储复杂的数据,以及一些需要高度一致性的数据(如银行的账单)。相反,如果业务更加看重读写速度,而可以一定程度上牺牲一致性的话,非关系型数据库则是一个好的选择。

  值得一提的是,关系型数据库大多都是在磁盘上运行,数据是实时落盘的。而非关系型数据库则多数运行在缓存中,数据的落盘、恢复一个比较大的问题。

  两者的对比以及一些特定我就分享到这里了,希望能够帮助到您,欢迎评论、转发,谢谢您的支持!

Welcome to my other publishing channels