我已经读过的NoSQL数据库的三种类型是键值,面向列和面向文档。
键值很简单-一个具有简单值的键。
我见过将面向文档的数据库描述为键-值,但该值可以是结构,例如JSON对象。每个“文档”可以具有全部,部分或相同的键。
面向列似乎非常类似于面向文档,因为您没有指定结构。
那么,这两者之间有什么区别,为什么您要使用一个而不是另一个呢?
我专门研究了MongoDB和Cassandra。我基本上需要一个可以更改但不影响其他值的动态结构。同时,我需要能够搜索/过滤特定键并运行报告。有了CAP,AP对我来说是最重要的。只要不存在数据冲突或丢失,就可以“最终”跨节点同步数据。每个用户都会得到他们自己的“表”。
最佳答案
在Cassandra中,每一行(用键寻址)都包含一个或多个“列”。列本身就是键值对。列名不需要预定义,即结构不是固定的。行中的列根据其键(名称)以排序的顺序存储。
在某些情况下,一行中的列可能非常多(例如,用作启用特定类型查询的索引)。 Cassandra可以有效地处理如此大的结构,并且您可以检索特定范围的列。
还有一个称为 super 列的结构(不是很常用),其中一列包含嵌套的(子)列。
您可以将整体结构视为嵌套的哈希表/字典,具有2或3个级别的键。
普通列族:
row
col col col ...
val val val ...
super 列族:
row
supercol supercol ...
(sub)col (sub)col ... (sub)col (sub)col ...
val val ... val val ...
还有更高层次的结构-列族和键空间-可用于将数据划分或组合在一起。
另请参阅此问题:Cassandra: What is a subcolumn
或来自http://wiki.apache.org/cassandra/ArticlesAndPresentations的数据建模链接
Re:与面向文档的数据库进行比较-后者通常插入整个文档(通常为JSON),而在Cassandra中,您可以处理单个列或超列,并分别进行更新,即它们以不同的粒度级别工作。每列都有自己单独的时间戳记/版本(用于协调分布式集群中的更新)。
Cassandra列的值仅是字节,但可以键入为ASCII,UTF8文本,数字,日期等。
当然,您可以通过插入包含JSON的列来将Cassandra用作原始文档存储-但是您将无法获得真正的面向文档的存储的所有功能。
关于mongodb - 面向列的NoSQL与面向文档的NoSQL有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7565012/