EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

《NoSQL 精粹》第一章-为什么使用 NoSQL

关系型数据库的价值

阻抗失谐

基于关系代数(relational algebra),关系模型把数据组织成关系(relation)和元组(tuple)。元组是由键值对(name-value pair)构成的集合,而关系则是元组的集合。

SQL 操作所使用及返回的数据都是关系元组不能包含嵌套记录(nested record)或列表(list)等任何结构。而内存中的数据结构则无此限制,它可以使用的数据组织形式比关系更丰富。

关系模型和内存中的数据结构之间存在差异。这种现象通常称为阻抗失谐

如果在内存中使用了较为丰富的数据结构,那么要把它保存到磁盘之前,必须先将其转换成关系形式。于是就发生了阻抗失谐:需要在两种不同的表示形式之间转译

阻抗失谐

解决方法:

  1. 面向对象数据库
  2. 对象-关系映射框架(object-relational mapping framework)

新的问题:

  1. 查询性能问题
  2. 集成问题

应用程序数据库与集成数据库

集成数据库

SQL 充当了应用程序之间的一种集成机制。数据库在这种情况下成了集成数据库(integration database)。

  1. 通常由不同团队所开发的多个应用程序,将其数据存储在一个公用的数据库中。
  2. 所有应用程序都在操作内容一致的持久数据,提高了数据通信的效率
  3. 为了能将很多应用程序集成起来,数据库的结构比单个应用程序所要用到的结构复杂得多
  4. 如果某个应用程序想要修改存储的数据,那么它就得和所有使用此数据库的其他应用程序相调。
  5. 各种应用程序的结构和性能要求不尽相同,数据库通常不能任由应用程序更新其数据。为了保持数据库的完整性,我们需要将这一责任交由数据库自身负责。

应用程序数据库

将数据库视为应用程序数据库(application database),其内容只能由一个应用程序的代码库直接访问。由于只有开发应用程序的团队才需要知道其结构,模式的维护与更新就更容易了。由于应用程序开发团队同时管理数据库和应用程序代码,因此可以把维护数据库完整性的工作放在应用程序代码中。

在使用应用程序数据库后,由于内部数据库与外部通信服务之间已经解耦,所以外界并不关心数据如何存储,这样就可以选用非关系型数据库了。关系型数据库的许多特性,诸如安全性等,可以交给使用该数据库的外围应用程序(enclosing application)来做。

蜂拥而来的集群

纵向扩展(scale up):功能强大的计算机、更多的处理器、磁盘存储空间和内存。但成本高、扩展尺度有限。

横向扩展(scale out):采用由多个小型计算机组成的集群。集群中的小型机使用性价比较高的硬件,降低扩展所需的成本。

关系型数据库并不是设计给集群用的。

NoSQL 登场

NoSQL 没有规范的定义,一般解释为开源分布式的非关系型数据库。

各种 NoSQL 数据库的共同特性是:

  1. 不使用关系模型
  2. 在集群中运行良好
    1. 关系型数据库使用 ACID 事务来保持整个数据库的一致性,而这种方式本身与集群环境相冲突
    2. NoSQL 数据库为处理并发及分布问题提供了众多选项
  3. 开源
  4. 适用于 21 世纪的互联网公司
  5. 无模式
    1. 不用事先修改结构定义,即可自由添加字段
    2. 这在处理不规则数据和自定义字段时非常有用