[数据库] 对数据库选型的几个疑问

因为平常工作只涉及到前端的内容,所以对数据库了解比较浅薄。在读完老师写的系统设计常见取舍之一 SQL vs NoSQL以及文章末尾的引用的其他文章后仍存在一下的疑问:

  1. 为什么NoSQL的读写性能要比SQL要来的好?
    我看到许多文章里面都提到SQL的读写性能不如NoSQL的原因是SQL为了保证ACID使用了锁,从而降低了读写的性能。这是意味着使用SQL就一定会使用事务吗?如果使用SQL却不用事务,那么SQL的读写性能是不是和NoSQL一样?
  2. SQL对于水平扩展不友好
    想和老师确认一下SQL水平扩展之所以不友好是因为在设计关系型数据库表的时候通常都会normalize并使用join来读取数据,但是join却不能在水平扩展的时候使用。另一个原因是使用关系型数据库的一大原因是ACID,但是如果进行水平扩展的话就很难保证ACID?
  3. 面试中回答SQL还是NoSQL
    3.1 可否理解为一旦数据不需要强一致性,那么一律选择NoSQL,因为NoSQL提供了更好的读写性能?
    3.2 如果数据不需要强一致性,是否还是可以说选用SQL,因为SQL易用,更加成熟,且有更好的社区的支持?
  1. 首先事务(Transaction) 和 Lock(锁) 都跟一致性相关,但不是同一个概念。Transaction 作用是机器发出的多条数据库指令要么都发生,要么都不发生。Lock 作用是是同一个资源在同一时间只能有一台机器访问。
    其次,虽然不是每一条 SQL 指令都要使用事务,但是 SQL by definition 需要满足 ACID,所以数据库层面必须支持事务和锁。对高一致性的支持会造成性能的降低。
  2. JOIN 可以在分布式系统中使用,多数 SQL proxy 都支持 JOIN,但支持 JOIN 的代价是很大的,分布式情况下需要进行大量的数据传输。SQL 数据库在利用 SQL Proxy 进行水平扩展后无法再满足绝对的 Consistency。从某种意义上来说,进行了水平扩展的 SQL 数据库已经不再支持 ACID 了,而是会采用更低的 Consistency 要求来换取 Avaiablity。相反 NoSQL 是原生支持水平扩展的。
  3. 这个问题参考我在 SQL vs NoSQL 文章里讲的几点,你这里说的有点简化了,还需要看存储的数据模型。就像文章里说的,两者的界限是模糊的,对于很多题目其实没有说一定选 SQL 就比 NoSQL 好,或者倒过来。有的题目的 tradeoff 会更明确一点。另外,跟非功能性需求也有关,需要跟面试官讨论,言之有理就行。
    举个例子,Facebook 的系统中大量使用 MySQL,其原因就不是需要一致性,而是需要一个成熟的系统做底层,以便在这个基础上开发适合公司业务的改进

这些问题提的都很好,相信你确实好好地学习过了相关的内容。

2 个赞

感谢老师的解答! :+1: