我知道有三种不同的流行类型的非 SQL 数据库。
键/值:Redis、Tokyo Cabinet、Memcached
ColumnFamily:Cassandra、HBase
文档:MongoDB、CouchDB
我已经阅读了关于它的长篇博客,但没有太多了解。
我了解关系数据库,并且熟悉 MongoDB/CouchDB 等基于文档的数据库。
有人能告诉我这些和名单上的前两个之间的主要区别是什么吗?
主要区别在于数据模型和查询功能。
键值存储
第一种非常简单,可能不需要任何进一步的解释。
数据模型:不仅仅是键值存储
尽管 Cassandra 等数据库的正确名称上有 some debate,但我还是想将它们称为 column-family stores。尽管键值对是 Cassandra 的重要组成部分,但不仅限于此。它允许您嵌套键值对,因此一个键可以引用多个子键值对。
但是,您不能无限期地嵌套键值对。您仅限于三个级别(列族)或四个级别的嵌套(超级列族)。如果术语列族没有响起,请参阅 WTF is a SuperColumn 文章,它很好地解释了 Cassandra 的数据模型。
文档数据库,例如 CouchDB 和 MongoDB,以 JSON objects 的形式存储整个文档。您可以将这些对象视为嵌套的键值对。与 Cassandra 不同的是,您可以随意嵌套键值对。 JSON 还支持数组并理解不同的数据类型,例如字符串、数字和布尔值。
查询
我相信列族商店只能通过键查询,或者通过编写 map-reduce 函数。您不能像在 SQL 数据库中那样查询值。如果您的应用程序需要更复杂的查询,您的应用程序必须创建和维护索引才能访问所需的数据。
文档数据库也支持 key 查询和 map-reduce 功能,但也允许您进行基本的 value 查询,例如“给我所有超过 10 个帖子的用户”。文档数据库以这种方式更加灵活。
Ayende 对 Key-Value 和 Document 数据库之间的区别给出了很好的解释:
文档数据库的核心是一个键/值存储,但有一个主要例外。文档数据库不只是在其中存储任何 blob,而是要求数据以数据库可以理解的格式(即 JSON、XML 等)存储。在大多数 doc dbs 中,这意味着我们现在可以允许对文档数据进行查询。