Cassandra是一个开源的分布式数据库,面向列的特点,可以将Cassandra的数据模型想象成一个多维的Hash。
- 高度可扩展性和高度可用性,没有单点故障
- NoSQL 列族实现
- 非常高的写入吞吐量和良好的读取吞吐量
- 类似 SQL 的查询语言(从 0.8 起),并通过二级索引支持搜索
- 可调节的一致性和对复制的支持
- 灵活的模式
数据模型: column , supercolumn , columnfamily , keyspace
COLUMN
Column是Cassandra中最小的数据单元。它是一个3元的数据类型,包含:name,value和timestamp。
将一个Column用JSON的形式表现出来如下:
{ // 这是一个column
2: name: "逖靖寒的世界",
3: value: "[email protected]",
4: timestamp: 123456789
5: }
为了简单起见,我们可以忽略timestamp。就把column想象成一个name/value即可。
注意,这里提到的name和value都是byte[]类型的,长度不限。
SUPERCOLUMN
我们可以将SuperColumn想象成Column的数组,它包含一个name,以及一系列相应的Column。
将一个SuperColumn用JSON的形式表现如下:
1: { // 这是一个SuperColumn
2: name: "逖靖寒的世界",
3: // 包含一系列的Columns
4: value: {
5: street: {name: "street", value: "1234 x street", timestamp: 123456789},
6: city: {name: "city", value: "san francisco", timestamp: 123456789},
7: zip: {name: "zip", value: "94107", timestamp: 123456789},
8: }
9: }
Columns和SuperColumns都是name与value的组合。最大的不同在于Column的value是一个“string”,而SuperColumn的value是Columns的Map。
还有一点需要注意的是:SuperColumn’本身是不包含timestamp的。
COLUMNFAMILY
ColumnFamily是一个包含了许多Row的结构,你可以将它想象成RDBMS中的Table。
每一个Row都包含有client提供的Key以及和该Key关联的一系列Column。
我们可以看看结构:
1: UserProfile = { // 这是一个ColumnFamily
2: phatduckk: { // 这是对应ColumnFamily的key
3: // 这是Key下对应的Column
4: username: "gpcuster",
5: email: "[email protected]",
6: phone: "6666"
7: }, // 第一个row结束
8: ieure: { // 这是ColumnFamily的另一个key
9: //这是另一个Key对应的column
10: username: "pengguo",
11: email: "[email protected]",
12: phone: "888"
13: age: "66"
14: },
15: }
ColumnFamily的类型可以为Standard,也可以是Super类型。
我们刚刚看到的那个例子是一个Standard类型的ColumnFamily。Standard类型的ColumnFamily包含了一系列的Columns(不是SuperColumn)。
??Super类型的ColumnFamily包含了一系列的SuperColumn??,但是并不能像SuperColumn那样包含一系列Standard ColumnFamily。
这是一个简单的例子:
1: AddressBook = { // 这是一个Super类型的ColumnFamily
2: phatduckk: { // key
3: friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"},
4: John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
5: Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
6: Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
7: Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
8: ...
9: }, // row结束
10: ieure: { // key
11: joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
12: William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
13: },
14: }
KEYSPACE
Keyspace是我们的数据最外层,你所有的ColumnFamily都属于某一个Keyspace。一般来说,我们的一个程序应用只会有一个Keyspace。