大話Cassandra數據模型

Cassandra是一個開源的分佈式數據庫,結合了Dynamo的Key/Value與Bigtable的面向列的特點。

Cassandra 的特點如下:

1.靈活的schema:不需要象數據庫一樣預先設計schema,增加或者刪除字段非常 方便(on the fly)。

2.支持range查詢:可以對Key進行範圍查詢。

3.高可用,可擴展: 單點故障不影響集羣服務,可線性擴展。

我們可以將Cassandra的數據模型想象成一個四維或者五維的 Hash。

Column

Column是Cassandra中最小的數據單元。它是一個3元的數據類型,包 含:name,value和timestamp。

將一個Column用JSON的形式表現出來如下:

   1:

{ // 這是一個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。

簡單測試

我們將Cassandra運行起來以後,啓動命令行,執行如下操作:

cassandra> set Keyspace1.Standard1['jsmith']['first'] = 'John'
Value inserted.
cassandra> set Keyspace1.Standard1['jsmith']['last'] = 'Smith'
Value inserted.
cassandra> set Keyspace1.Standard1['jsmith']['age'] = '42'
Value inserted.

這個時候,Cassandra中就已經有3條數據了。

其中插入數據的各個字段含義如下:

set Keyspace1.Standard1['jsmith']['first'] = 'John'
     /                /         /        /          /
      /                /         /_ key /          /_ value
       /                 /                  /_ column
        /_ keyspace  /_ column family

接下來,我們執行查詢操作:

cassandra> get Keyspace1.Standard1['jsmith']
  (column=age, value=42; timestamp=1249930062801)
  (column=first, value=John; timestamp=1249930053103)
  (column=last, value=Smith; timestamp=1249930058345)
Returned 3 rows.

這樣,我們就可以將之前插入的數據查詢出來了。

參考文檔

WTF is a SuperColumn? An Intro to the Cassandra Data Model

DataModel

發佈了335 篇原創文章 · 獲贊 3 · 訪問量 66萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章