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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

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

键-值是非常直接的-一个简单值的键。

我见过面向文档的数据库被描述为类似于键值,但是值可以是一个结构,比如JSON对象。每个“文档”都可以拥有与另一个文档相同的所有、部分或没有相同的键。

面向列似乎非常类似于面向文档的,因为您没有指定结构。

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

我专门看过MongoDB和Cassandra。我基本上需要一个动态的结构,可以改变,但不影响其他价值。同时,我需要能够搜索/过滤特定的键并运行报告。有了CAP,AP对我来说是最重要的。只要没有冲突或数据丢失,数据就可以“最终”在节点之间同步。每个用户都会得到自己的“表”。

提问于
用户回答回答于

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

在某些情况下,可能在一行中有大量列(例如,用作索引以启用特定类型的查询)。Cassandra可以有效地处理这样大的结构,并且可以检索特定的列范围。

还有一个更高级别的结构(不是很常用)叫做超级列,其中一个列包含嵌套(子)列。

可以将整个结构看作嵌套的哈希表/字典,其中包含2或3级键。

普通列族:

row
    col  col  col ...
    val  val  val ...

超级专栏家族:

row
      supercol                      supercol                     ...
          (sub)col  (sub)col  ...       (sub)col  (sub)col  ...
           val       val      ...        val       val      ...

还有更高层次的结构--列族和键空间--它们可以用来划分或分组数据。

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

Cassandra列值只是字节,但可以键入ASCII、UTF 8文本、数字、日期等。

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

用户回答回答于

主要的区别是文档存储(例如MongoDB和CouchDB)允许任意复杂的文档,即子文档中的子文档、带有文档的列表等,而列存储(例如Cassandra和HBASE)只允许固定格式,例如严格的一级或二级词典。

扫码关注云+社区