作为“云计算”时代的架构设计人员而言,不懂K-V库会被人说out的,为此,笔者在“人云已云”的忽悠下,也开始接触K-V数据库了。
在啥都不清楚的情况下,首先选择跟风,未必是一件坏事。尤其对技术人员而言,先入门再做选择,也不失为一种方法。“听说xxx大网站都是用Cassandra存储他们的SNS数据的,我们也要试试”,于是乎,开始了Casssandra初体验。
(PS:本文不是cassandra的入门学习的材料。以下均为笔者自己的理解,一家之言,不正确的地方,望指正...)
以OO的方式理解Cassandra的数据模型
学习Cassandra,首先要理解它有别于传统数据库的存储模型。对于常使用HashMap的Java程序员而言,K-V的映射结构并不难理解。
把Cassandra的ColumnFamily看成HashMap
网上有不少文章认为ColumnFamily类似RDB中的Table,这样理解有一定道理,但笔者更愿意从OOD的角度去诠释它。从Cassandra的设计实现上看,把它理解为大型的散列结构的索引更贴近其本来面目。
ColumnFamily中的K-V映射
ColumnFamily中的K-V映射有两大类型:
1.基于Column的 “1个Key” --->“n个Column” 的单层映射
2.基于SuperColumn的 “1个key” ---> “n个SuperColumn” ,“1个SuperColumn”--->“n个SubColumn”的两层映射
针对第一种单层映射,从OOD角度看,笔者理解为 1 Key --> 1 Javabean的标准HashMap映射。你完全可以把“n个Column”理解为直接暴露在外的Bean的n个属性。
而对于第二种的两层映射,笔者认为是 1 Key --> Bean列表 的 1对n 映射。这里,你可以把“1个SuperColumn”--->“n个SubColumn”的映射,理解为 1个Bean 对 n个属性的映射封装;把“1个key” ---> “n个SuperColumn”,视为 Key 对 Bean 的一对多映射,即 Key 映射 一个Bean列表。
之所以笔者使用对象模型视角,而不是数据库的行列模型视角来看待Cassandra,是有以下原因的:
首先,Cassandra设计以Key为主导的数据映射寻址机制有别于以“ResultSet结果集”为主的传统RDB数据获取模式。
其次,从Cassandra数据的持久化实现上看,对于一个SuperColumn的读取和存储,Cassandra是采用了一次性序列化的。也就是说,即便你只访问SuperColumn下的1个SubColumn的值,Cassandra也需要把这个SuperColumn下的所有SubColumns都读出,一次性进行反序列化,而后返回你要单个属性列。从这点上看,笔者认为Cassandra的设计者是将SuperColumn视为整体的一个持久化对象(一个完整的JavaBean)来看待。
Column的排序与组织
在Cassandra中,给出Column/SuperColumn的排序方式是十分重要的事。事实上,在你定义ColumnFamily时,你是无需定义其包含了那些Column/SuperColumn,而更重要的是定义Column/SuperColumn的排序方式。这里,笔者根据自己的理解做以下的判断:
1.ColumnFamily与RDB的Table结构完全不同&#x