前言


横向对比


关系型数据库
关系型这是最常见的经典的数据库模式。关系数据库管理系统(RDBMS),是基于集合理论的系统,实现方式是具有行和列的二维表。
关系数据库严格强制使用类型,一般分为数值、字符串、日期和未解释的二进制大对象,但我们看到PostgreSQL提供了一些扩展,如数组和cube。
适合
因为关系数据库的结构性质,如果提前知道数据的布局,但是可能不清楚随后你打算如何使用这些数据,那么关系型数据库是合适的。或者,换句话说,你提前为组织的复杂性付出代价,以实现随后的查询灵活性。许多业务问题正好是以这种方式建模的,从接单到出货以及库存到购物车。你可能事先不知道以后将如何查询数据,但数据在本质上是相当规范的,所以强制这种规范性是很有帮助的。
不适合
如果你的数据是高度可变的或者多层次的,那么关系数据库不是最合适。因为你必须提前指定模式,所以,处理记录与记录之间有很大变化的数据问题将遇到麻烦。假设考虑开发一个数据库来描述所有自然界中的生物。创建你需要考虑到的所有特征的完整列表(hasHair、numLegs、laysEggs等)会很棘手。在这种情况下,你选择的数据库最好对可能的输入有较少的预先限制。
键值型数据库
KV将简单的键映射到(可能)更复杂的值,就像一个巨大的哈希表。由于它们相对简单,因此这种类型的数据库实现起来最灵活。哈希查找速度快,在Redis的例子中就是这样,速度是其主要的关注。哈希查找也容易分布化,所以Riak利用这一事实,侧重于简单管理的集群。当然,它的简单性可能对有复杂的建模需求的数据是个缺点。
适合
由于很少或不需要维护索引,键-值存储库往往具有横向的可扩展性,速度极快,或两者兼而有之。它们特别适合于数据相关性不高的问题。例如,在Web应用中,用户的会话数据满足这个标准,每个用户的会话活动会有所不同,并且大部分是与其他用户的活动无关的。
不适合
往往缺乏索引和扫描功能,如果你需要能够执行数据查询,除了基本的CRUD操作(创建、读取、更新、删除)以外,KV存储库的帮助不大。
列型数据库
与KV和RDBMS存储有许多的相似之处。像键-值存储库一样,值的查询通过匹配键完成。类似于关系数据库,把它们的值分组为零或多列,但是每一行可以填充任意多的数据。不同于前两个数据库,列型数据库按列存储类似的数据,而不是按行存储数据。列的添加很容易,版本控制是小菜一碟,并且对于空值没有存储成本。我们看到了HBase是对这一类型的经典实现。
适合
传统上,横向扩展作为列型数据库开发的一个主要的设计目标。正因为如此,它们特别适合于在几十、几百或几千个节点的集群上的“大数据”问题。它们也往往内置支持如压缩和版本控制的功能。一个良好的列型数据存储问题的典型例子是索引网页。网页上有大量的文本(好处来自于压缩),在某种程度上相互关联,并随着时间变化(好处来自于版本控制)。
不适合
不同的列型数据库有不同的特点,并由此带来不同缺点。但有一件事它们是相同的,那就是,最好基于你打算如何查询数据,设计你的数据库模式。这意味着,你应该预先对如何使用数据而不仅仅是数据将如何组成有一些想法。所以,如果你不能提前定义数据的使用模式(例如,需要快速的自由定义的报表),那么列型数据库未必是最合适的。
文档型数据库
文档型数据库允许每个对象有任意数量的字段,甚至允许对象作为值以任意深度嵌套到其他字段中。这些对象通常用JavaScript对象符号(JSON)表示,MongoDB和CouchDB都是这样,但这绝不是一个概念要求。
由于文档型数据库不像关系数据库那样彼此相关,它们比较容易在几个服务器上实现分片和复制,这使得分布式实现相当普遍。
适合
文档数据库适合于涉及高度可变领域的问题。当你事先不知道你的数据看起来究竟像什么样子,文档型数据库是一个不错的选择。此外,由于文档型数据库的性质,它们往往能很好地映射到面向对象编程模型。这意味着在数据库模型和应用模型之间移动数据时,阻抗性不匹配的情况较少。
不适合
如果你习惯于在高度规范化的关系数据库模式中执行复杂的联接查询,你会发现文档型数据库的功能匮乏。文档型数据库一般应包含大部分或全部正常使用所需的有关信息。因此,在一个关系数据库中,你最好自然地规范化你的数据,以减少或消除可能不同步的副本,而使用文档型数据库,非规范化的数据是常态。
图数据库
图数据库是一个新兴的数据库类型,更侧重于自由解释数据之间的相互关系而不是实际的数据值。作为我们的开源示例,Neo4j在许多社交网络应用中日益普及。不像其他数据库类型将相似的对象划为共同的组,图数据库在形式上更自由——查询包含两个节点共享的边,即在节点之间移动。随着越来越多的项目使用它们,图数据库在简单的社交例子上不断发展,用于更多差异细微的使用场景,例如,推荐引擎、访问控制列表和地理数据。
适合
图数据库似乎是为网络应用量身定做的。典型的例子是社交网络,其中节点代表相互之间有各种关系的用户。使用任何其他的类型对这种数据建模,往往难以适应,但图数据库会欣然接受。它们还是面向对象系统的完美匹配。如果可以在白板上建模数据,就可以在图中建模。
不适合
由于节点之间的高度相互关联,因此图数据库一般不适合网络分区。因为图的快速爬取意味着你不能与其他数据库节点的网络联接,所以图数据库不能很好地向外扩展。可能的情况是,如果你使用图数据库,它会是一个较大系统的一部分,大容量数据存储在其他地方,而在图中只保存关系。

本文是《七周七数据库》的读书笔记,对比了关系型(MySql)、键值型(Redis)、列型(HBase)、文档型(MongoDB)和图型(Neo4j)数据库的优缺点。关系型数据库适合结构化数据,不适合高度可变的数据;键值型数据库适合快速CRUD操作,不适合复杂查询;列型数据库适合大数据和集群,不适合自由定义报表;文档型数据库适合高度可变领域,不适合复杂联接查询;图数据库适合社交网络和关系建模,不适合网络分区。
2612

被折叠的 条评论
为什么被折叠?



