今天来对比下关系型数据库和非关系型数据库。包括各自的优势和劣势。

关系型数据库优势

  1. 关系型数据库的性能不低,它具有非常高的通用性和非常高的性能。
  2. 关系型数据库支持事务,保持数据的一致性。
  3. 由于以标准化为前提,数据更新的开销很小。
  4. 支持JOIN查询

关系型数据库不擅长处理

  • 大量数据的写入处理
    数据库扩展中,使用主从模式可以到达规模化,但在写入上遇到困难。主数据库负责写,多个从数据库负责读。当写移到瓶颈时,通过扩展主数据库就不简单了。为了简单起见,考虑二元主数据库。那么主数据库在分表有两种方法。同一张表关联复制到两台服务器上,或者,不同表分切到不同服务器上。前者遇到的问题就是,写入时两台服务器可能遇到数据不一致的情况(需要对每个表的处理分配到不同的主服务器上,这个不简单)。后者数据分配上直接在内存中完成,减少磁盘I/O操作,但,很难进行JOIN操作。分别存储在不同服务器上的表之间无法进行JOIN操作

  • 表在有数据更新的情况下做索引和表结构、模式(schema)变更
    为了加快查询速作索引,为了增加必要的字段作表的结果变更,这些处理都需要多表进行共享锁定。这两个操作期间,其他的数据变更操作都无法进行。

名称 锁的影响范围 别名
共享锁 其他连接可以读取数据但不能修改数据 读锁
排他锁 其他连接无法读取数据,也不能修改数据 写锁
  • 对简单查询需要返回快速结果的处理
    关系型数据库专门使用SQL语言进行数据的读取,它需要对SQL语句进行解析,同时要多表进行锁定和解锁,这些都需要额外的开销。如果不使用SQL解析过程,也可以使用HandlerSocket

    HandlerSocket is a NoSQL plugin for MySQL, working as a daemon inside the mysqld process, to accept tcp connections, and execute requests from clients. HandlerSocket does not support SQL queries; instead it supports simple CRUD operations on tables. 来自Github

  • 当应用业务本身字段并不固定的情况
    上述讲了表结构变更期间数据更新无法进行,因此业务本身如果是字段不固定的情况,那么使用关系型数据库很难支持。尽管可以,但键表在有数据更新的情况下做索引和表结构、模式(schema)变更

非关系型数据库的优势

  • 利于数据的分散
    NoSQL在设计上不支持JOIN操作,各个数据都可以独立设计,不需要考虑它们的关联作用而把数据放到同一台服务器中,这样很利于数据分散到多台服务器中。由于分散到多台服务器中,大量数据的写入支持会更好。同时,数据的读入也是相当容易。

  • 流畅地对数据进行缓存

  • 对数组类型数据进行高速处理

非关系型数据库不擅长处理

  • JOIN操作

  • 严格的关系型数据库的事务支持

关系型数据库和非关系型数据库如何选择

NoSQL的出现不是为了取代关系型数据库,而是作为关系型数据库的补充。

在具体的业务情景下,关系型数据库擅长处理的就使用关系型数据库,关系型数据库不擅长处理的就使用非关系型数据库。