基于文档的数据库与基于键/值的数据库之间的区别?


97

我知道有三种不同的,流行的非SQL数据库类型。

  • 键/值:Redis,Tokyo Cabinet,Memcached
  • ColumnFamily:Cassandra,HBase
  • 文件:MongoDB,CouchDB

我已经读了很长的博客,但对它的了解却很少。

我知道关系数据库,并且在MongoDB / CouchDB等基于文档的数据库中徘徊。

谁能告诉我这些和清单上的两个前者之间的主要区别是什么?


4
共有五个:(1)键值存储:Oracle Coherence,Redis,Kyoto Cabinet(2)BigTable风格的数据库:Apache HBase,Apache Cassandra(3)文档数据库:MongoDB,CouchDB(4)全文搜索引擎:Apache Lucene,Apache Solr(5)图形数据库:neo4j,FlockDB,请参见nosql-data-modeling-techniques
Gary Gauh 2013年

Answers:


74

主要区别在于数据模型和查询功能。

键值存储

第一种非常简单,可能不需要进一步说明。

数据模型:超过键值存储

尽管对于诸如Cassandra之类的数据库的正确名称存在一些争论,但我想将它们称为列族存储。尽管键值对是Cassandra的重要组成部分,但不仅限于此。它允许您嵌套键值对,因此一个键可以引用多个子键值对。

但是,您不能无限期地嵌套键/值对。您仅限于三个级别(列族)或四个级别的嵌套(超级列族)。如果术语“列族”不响,请参见WTF是SuperColumn的文章,它很好地解释了Cassandra的数据模型。

文档数据库(例如CouchDB和MongoDB)以JSON对象的形式存储整个文档。您可以将这些对象视为嵌套的键值对。与Cassandra不同,您可以根据需要嵌套键-值对。JSON还支持数组,并了解不同的数据类型,例如字符串,数字和布尔值。

查询方式

我相信只能通过键或编写map-reduce函数来查询列族存储。您无法像在SQL数据库中那样查询值。如果您的应用程序需要更复杂的查询,则您的应用程序将必须创建和维护索引才能访问所需的数据。

文档数据库还支持按键和map-reduce函数进行查询,但是还允许您按值进行基本查询,例如“给我所有拥有10条以上帖子的用户”。文档数据库以这种方式更加灵活。


2
因此,像redit这样的键值存储不允许您存储嵌套的key:values?从您的描述出发,然后将整个数据库(来自RDBMS)存储到Cassandra中听起来不是很聪明,因为它不允许灵活的查询并且嵌套深度有限,对吗?
never_had_a_name

7
@ajsie:正确的键值存储区不支持嵌套键值对。他们中的大多数确实支持特殊的值,例如列表。Cassandra与RDBMS有很大的不同,因为两者都旨在解决非常不同的问题。RDBMS系统针对需要复杂查询的关系数据,而Cassandra则针对处理大量的大部分非关系数据。当然,可以将RDBMS数据库移至Cassandra,但确实不是很聪明。它们每个都有自己的用途。
尼尔斯·范德·雷斯特

那么,每个文档数据库也是键,值存储区吗,其中的值只是一个像{value:base64(val)}这样的JSON?
GroovyDotCom

@GroovyDotCom:是的,您可以使用文档数据库来存储简单的键/值对象。
Niels van der Rest

15

Ayende对键值和文档数据库之间的区别给出了很好的解释:

文档数据库的核心是键/值存储,但有一个主要例外。文档数据库不仅要求在其中存储任何Blob,还要求数据将以数据库可以理解的格式(即JSON,XML等)存储。在大多数文档数据库中,这意味着我们现在可以允许对文档数据进行查询

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.