资源描述:
《cassandra数据模型》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Cassandra数据模型Publishedbyjackyon2010-02-10in大话技术.Tags:Cassandra,NoSQL.提起NoSQL这个话题,仿佛不应该是DBA要关注的事,而是架构师应该关心的。但是作为一名DBA,在使用传统的关系型思想建模时,应该有必要了解NoSQL的建模方法。各种NoSQL数据库有很多,我最关注的还是BigTable类型,因为它是一个高可用可扩展的分布式计算平台,用来处理海量的结构化数据,而数据库同样也是处理结构化数据,所以除了没有SQL,在数据模型方面有相似之处。Cassandra是faceb
2、ook开源出来的一个版本,可以认为是BigTable的一个开源版本,目前twitter和digg.com在使用。我们尝试从DBA的角度出发去理解Cassandra的数据模型。NoSQL并不能简单的理解为NoSQL,其本质应该是NoRelational,也就是说它不是基于关系型的理论基础,而我们所有传统的数据库都是基于这套理论而发展起来的,所以SQL并不是问题的关键所在,比如有些NoSQL数据库可以提供SQL类型的接口,允许你通过类SQL的语法去访问数据。而Friendfeed则是反其道而行之,利用关系型数据库MySQL,采用了去关系化
3、的设计方法,去实现自己的KeyValue存储。所以NoSQL的本质是NoRelational.Cassandra特点:1.灵活的schema,不需要象数据库一样预先设计schema,增加或者删除字段非常方便(onthefly)。2.支持range查询:可以对Key进行范围查询。3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。KeyspaceCassandra中的最大组织单元,里面包含了一系列Columnfamily,Keyspace一般是应用程序的名称。你可以把它理解为Oracle里面的一个schema,包含了一系列的对象。C
4、olumnfamily(CF)CF是某个特定Key的数据集合,每个CF物理上被存放在单独的文件中。从概念上看,CF有点象数据库中的Table.Key数据必须通过Key来访问,Cassandra允许范围查询,例如:start=>'10050',:finish=>'10070'Column在Cassandra中字段是最小的数据单元,column和value构成一个对,比如:name:“jacky”,column是name,value是jacky,每个column:value后都有一个时间戳:timestamp。和数据库不同的是,Cassa
5、ndra的一行中可以有任意多个column,而且每行的column可以是不同的。从数据库设计的角度,你可以理解为表上有两个字段,第一个是Key,第二个是长文本类型,用来存放很多的column。这也是为什么说Cassandra具备非常灵活schema的原因。SupercolumnSupercolumn是一种特殊的column,里面可以存放任意多个普通的column。而且一个CF中同样可以有任意多个Supercolumn,一个CF只能定义使用Column或者Supercolumn,不能混用。下面是Supercolumn的一个例子,home
6、Address这个Supercolumn有三个字段:分别是street,city和zip:homeAddress:{street:"binjiangroad",city:"hangzhou",zip:"310052",}Sorting不同于数据库可以通过Orderby定义排序规则,Cassandra取出的数据顺序是总是一定的,数据保存时已经按照定义的规则存放,所以取出来的顺序已经确定了,这是一个巨大的性能优势。有意思的是,Cassandra按照columnname而不是columnvalue来进行排序,它定义了以下几种选项:Bytes
7、Type,UTF8Type,LexicalUUIDType,TimeUUIDType,AsciiType, 和LongType,用来定义如何按照columnname来排序。实际上,就是把columnname识别成为不同的类型,以此来达到灵活排序的目的。UTF8Type是把columnname转换为UTF8编码来进行排序,LongType转换成为64位long型,TimeUUIDType是按照基于时间的UUID来排序。例如:Columnname按照LongType排序:{name:3,value:"jacky"},{name:123,v
8、alue:"hellodba"},{name:976,value:"Cassandra"},{name:832416,value:"bigtable"}Columnname按照UTF8Type排序:{name:123,v