面向列的NoSQL与面向文档有何不同?

Luk*_*uke 76 mongodb cassandra nosql

我读过的三种类型的NoSQL数据库是键值,面向列和面向文档.

键值非常简单 - 具有普通价值的键.

我已经看到面向文档的数据库被描述为键值,但值可以是一个结构,就像一个JSON对象.每个"文档"可以包含全部,一些或不具有与另一个相同的键.

面向列似乎非常像文档导向,因为您没有指定结构.

那么这两者之间有什么区别,为什么你会使用另一个呢?

我特意看了MongoDB和Cassandra.我基本上需要一个可以改变的动态结构,但不会影响其他值.同时,我需要能够搜索/过滤特定密钥并运行报告.有了CAP,AP对我来说是最重要的.只要没有冲突或数据丢失,数据就可以"最终"跨节点同步.每个用户都会得到他们自己的"桌子".

The*_*heo 46

主要区别在于文档存储(例如MongoDB和CouchDB)允许任意复杂的文档,即子文档中的子文档,文档列表等,而列存储(例如Cassandra和HBase)仅允许固定格式,例如严格的一级或两级词典.

  • 这是不同功能之间的权衡,采用面向列的设计,存储引擎可以比面向文档的存储引擎更加高效。如果文档变大,MongoDB 必须重写磁盘上的整个文档,但 Cassandra 不需要(这是一种简化,当然,这有很多细节)。这使得 Cassandra 在写入时速度更快。 (2认同)
  • 命名和理解更正:Cassandra 和 Hbase 是列“系列”存储,而不是列“面向”存储(又名列式存储)。CF 按行存储数据(= 面向行存储),CO 按列存储数据。参考:https://community.datastax.com/answers/6244/view.html (2认同)

DNA*_*DNA 34

在Cassandra中,每一行(由键寻址)包含一个或多个"列".列本身就是键值对.不需要预定义列名称,即结构不固定.连续的列根据其键(名称)按排序顺序存储.

在某些情况下,您可能会在一行中包含非常多的列(例如,充当索引以启用特定类型的查询).Cassandra可以有效地处理这种大型结构,您可以检索特定范围的列.

还有一个称为超级列的结构(不常用),其中列包含嵌套(子)列.

您可以将整体结构视为嵌套的哈希表/字典,具有2或3级密钥.

正常列族:

row
    col  col  col ...
    val  val  val ...
Run Code Online (Sandbox Code Playgroud)

超级列系列:

row
      supercol                      supercol                     ...
          (sub)col  (sub)col  ...       (sub)col  (sub)col  ...
           val       val      ...        val       val      ...
Run Code Online (Sandbox Code Playgroud)

还有更高级别的结构 - 列族和键空间 - 可用于将数据分开或组合在一起.

另见这个问题:Cassandra:什么是子列

或者来自http://wiki.apache.org/cassandra/ArticlesAndPresentations的数据建模链接

Re:与面向文档的数据库进行比较 - 后者通常插入整个文档(通常是JSON),而在Cassandra中,您可以处理单个列或超级列,并单独更新它们,即它们以不同的粒度级别工作.每列都有自己独立的时间戳/版本(用于协调分布式群集中的更新).

Cassandra列值只是字节,但可以键入ASCII,UTF8文本,数字,日期等.

当然,您可以通过插入包含JSON的列来使用Cassandra作为原始文档存储 - 但是您不会获得真正面向文档的存储的所有功能.

  • 列族就像一张桌子.一行就像一个表行.列有点像数据库列,除了它们可以在运行中定义,因此在某些情况下您可能有一个非常稀疏填充的表,或者您可能在每行中填充不同的列. (3认同)
  • 面向列的@Luke看起来非常像无架构的RDBMS,但除了松散的结构之外,主要区别在于它不是关系. (2认同)

use*_*961 24

在"插入"中,要使用rdbms单词,基于文档的更加一致和直接的前瞻性.请注意,与cassandra相比,您可以实现与仲裁概念的一致性,但这不适用于所有基于列的系统,并且会降低可用性.在一次写入/读取常常很重的系统上,转到MongoDB.如果你总是计划阅读对象的整个结构,也要考虑它.基于文档的系统设计用于在获得整个文档时返回整个文档,并且在返回整行的部分时不是很强.

像Cassandra这样的基于列的系统比"更新"中的基于文档的方式更好.您可以更改列的值,甚至不读取包含它的行.写操作实际上不需要在同一台服务器上完成,一行可能包含在多个服务器的多个文件中.在巨大的快速发展的数据系统上,去找Cassandra.如果您计划每个密钥拥有非常大的数据块,并且不需要在每个查询中加载所有数据,请考虑它.在"选择"中,Cassandra允许您仅加载所需的列.

还要考虑Mongo DB是用C++编写的,并且是第二个主要版本,而Cassandra需要在JVM上运行,它的第一个主要版本仅在昨天发布候选版本(但0.X版本转向了主要公司已经).

另一方面,Cassandra的设计部分基于Amazon Dynamo,它的核心是高可用性解决方案,但这与基于列的格式没有任何关系.MongoDB也可以扩展,但不像Cassandra那样优雅.