【问题标题】:Difference between Document-based and Key/Value-based databases?基于文档和基于键/值的数据库之间的区别?
【发布时间】:2011-04-03 00:31:10
【问题描述】:

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

  • 键/值:Redis、Tokyo Cabinet、Memcached
  • 列族:Cassandra、HBase
  • 文档:MongoDB、CouchDB

我已经阅读了关于它的长篇博客,但并不了解。

我了解关系数据库,并且熟悉 MongoDB/CouchDB 等基于文档的数据库。

谁能告诉我这些和列表中的前两个之间的主要区别是什么?

【问题讨论】:

  • 一共有五种:(1)Key-Value Stores: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

标签: mongodb couchdb cassandra redis non-relational-database


【解决方案1】:

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

键值对存储

第一种很简单,大概不需要解释了。

数据模型:不仅仅是键值存储

虽然 Cassandra 等数据库的正确名称上有 some debate,但我想将它们称为 列族存储。尽管键值对是 Cassandra 的重要组成部分,但不仅限于此。它允许您嵌套键值对,因此一个键可以引用多个子键值对。

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

文档数据库,如 CouchDB 和 MongoDB 以JSON objects 的形式存储整个文档。您可以将这些对象视为嵌套的键值对。与 Cassandra 不同的是,您可以随意嵌套键值对。 JSON 还支持数组并理解不同的数据类型,例如字符串、数字和布尔值。

查询

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

文档数据库也支持 key 查询和 map-reduce 功能,但也允许您进行基本的 value 查询,例如“给我所有超过 10 个帖子的用户”。文档数据库以这种方式更加灵活。

【讨论】:

  • 所以像 redit 这样的键值存储不允许你存储嵌套的 key:values?根据您的描述,将整个数据库(来自 RDBMS)存储到 Cassandra 中听起来不是很聪明,因为它不允许灵活查询并且嵌套深度有限,对吗?
  • @ajsie:正确,键值存储不支持嵌套键值对。不过,它们中的大多数确实支持专门的值,例如列表。 Cassandra 与 RDBMS 非常不同,因为两者都旨在解决非常不同的问题。 RDBMS 系统针对需要复杂查询的关系数据,而 Cassandra 旨在处理大量非关系数据。当然,可能将 RDBMS 数据库移动到 Cassandra,但确实不是很聪明。他们每个人都有自己的用途。
  • 所以每个文档数据库也是一个键值存储,其中值只是一个 JSON,例如 { value: base64(val) } ?
  • @GroovyDotCom:是的,您可以使用文档数据库来存储简单的键/值对象。
【解决方案2】:

Ayende 已经很好地解释了 Key-Value 和 Document 数据库之间的区别:

文档数据库的核心是具有一个主要功能的键/值存储 例外。 一个文档数据库,而不是仅仅在其中存储任何 blob 要求数据以数据库可以使用的格式存储 理解(即 JSON、XML 等)。在大多数 doc dbs 中,这意味着我们 现在可以允许查询文档数据。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 2012-06-29
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2013-08-16
    • 2018-02-25
    • 2015-09-12
    • 2015-03-20
    相关资源
    最近更新 更多