在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 ...
还有更高级别的结构 - 列族和键空间 - 可以用于分割或组合您的数据。
另请参阅此问题:Cassandra: 什么是子列
或者从http://wiki.apache.org/cassandra/ArticlesAndPresentations链接的数据建模。
关于与面向文档的数据库的比较 - 后者通常插入整个文档(通常是JSON),而在Cassandra中,您可以访问单个列或超列,并单独更新它们,即它们在不同的粒度级别上工作。每个列都有自己单独的时间戳/版本(用于跨分布式集群协调更新)。
Cassandra列值只是字节,但可以被类型化为ASCII、UTF8文本、数字、日期等。
当然,您可以通过插入包含JSON的列来将Cassandra用作原始文档存储,但您不会获得真正面向文档存储的所有功能。