当谈论MongoDB和Cassandra时,"面向文档"与"键值"是什么意思?

164

选择基于文档的 NoSQL 选项与 KV 存储相比有什么优势,反之亦然?


2
请查看http://nosql-database.org/。 - b_erb
这并没有告诉我在什么情况下以及为什么要使用哪个?何时使用Mongo比Cassandra更有优势,反之亦然? - tesserakt
4个回答

218
一个键值存储提供了最简单的数据模型,正如其名称所示:它是一个存储系统,通过键索引值。您只能通过键查询,而且这些值是不透明的,存储没有关于它们的任何信息。这允许非常快速的读写操作(简单的磁盘访问),我将此模型视为一种非易失性缓存(即如果您需要快速访问长期数据的键,则非常适合)。
面向文档的数据库扩展了先前的模型,值以结构化格式(称为文档)存储,数据库可以理解。例如,文档可以是博客文章、评论和标签以去规范化的方式存储。由于数据是透明的,存储可以执行更多工作(例如对文档字段进行索引),并且您不受仅按键查询的限制。正如我所暗示的那样,这些数据库允许使用单个查询获取整个页面的数据,并且非常适合面向内容的应用程序(这就是为什么像Facebook或Amazon这样的大型网站喜欢它们的原因)。
其他类型的NoSQL数据库包括列式存储、图形数据库甚至对象数据库。但这超出了问题的范围。
另请参见

3
键值存储不一定需要通过磁盘访问来完成,并且在某些实现中将其称为非易失性存储是不正确的。您可以在内存中创建一个键值存储,而无需写入或写回到非易失性存储介质。同时,将数据称为长期存储也是具有误导性的,因为数据的寿命与检索方式无关。 - Anthony
3
这个定义可能有点不太准确。基本上两者都是键值存储。在一个情况下,“值”是不透明的,数据库不知道用户将什么放入值中 - 只能通过键进行查询。在另一个情况下(“文档”),数据库更好地理解了值内部的内容,可以根据某些属性生成索引等,并可以以后进行查询。 - Ravi R
我想知道AWS的DynamoDB如何适应这种区分。AWS声称DynamoDB是键值数据库,但它允许创建索引并通过“非键”列查询项目。您能详细说明一下吗? - Dan Macak
2
@Skocdopole DynamoDB真的不允许在非键列上进行查询吗?它基本上会扫描整个数据库,并根据查询结果进行过滤。我知道DynamoDB允许我们创建二级索引,但这需要额外的时间来创建 - 这让我想到DynamoDB正在单独地为所有记录创建索引 - 也许是创建了一个新的“键值”表示形式? - Sidharth Ramesh

25

嗯,我最近大约一个月一直在研究NoSQL。我认为,它通常可以被描述为:

  • KV存储不知道键所存储的值内容
  • 基于文档的存储允许您在值内容中定义二级索引,因为数据库知道文档结构(例如博客文章的标签)。
  • NoSQL解决方案各自具有特定功能,应考虑这些功能,例如
    • KV存储中的特殊数据类型(例如Redis中的左/右推/弹出集合)
    • 像Riak说的那样,轻松扩展/缩小群集(我还没有尝试过...但)
    • 像Voldemort一样的可插拔数据存储
    • 内置Web配置和Web应用程序支持,如CouchDB / couchapp

4

最大的区别在于,面向文档的数据库支持二级索引,而键值对数据库不支持。一般来说,面向文档的数据库倾向于允许更丰富的查询,可以执行范围查询、排序和其他类型的“高级”操作。


Cassandra将在下一个版本(0.7)中支持二级索引。 - Schildmeijer

1
  1. 在键值数据库模型中,用户可以选择键是什么,而文档模型中的文档标识符通常是系统生成的。

  2. 键值数据库模型中的键值对不能分组,而在文档数据库中,我们可以将键值对分组成单独的文档;此外,某些形式的文档数据库甚至允许我们进一步将这些文档分组,即所谓的“集合”或“域”。

  3. 虽然文档数据库中的文档具有明确定义的内部结构(因此可以通过DBMS进行操作;例如,创建索引),但在键值数据库中,这些值的任何可能的内部结构都从DBMS的角度来看是不透明的。

  4. 在键值模型中,访问多个数据库条目(在这种情况下是键值对)需要单独的请求。另一方面,在文档模型中,可以在单个请求中检索多个数据库条目(在这种情况下是文档)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接