Cassandraのはじめ方─手を動かしてNoSQLを体感しよう

第3回 Cassandraのデータモデルを理解する

この記事を読むのに必要な時間:およそ 3 分

カラムファミリ ─カラムを保持する

カラムファミリはカラムを保持する器です。カラムの集合をロウと呼びますが,ロウにキーをつけて管理します。ロウには以下の2つの状態があります。

  • カラムが入る場合
  • スーパーカラムが入る場合

カラムとスーパーカラムを同一のカラムファミリに入れることはできません。必ずどちらかのケースになります。

各カラムファミリはロウごとにソートされており,アクセスの単位も基本的にはこのカラムファミリのロウが基準になりアトミックになります。そのためアトミックに処理する関連カラムはすべてカラムファミリに落とし込む必要があります。

カラムファミリはstorage-conf.xmlにて,たとえば「どういう名前でどういったカラム順序で保存しておくか」などを設定する必要があります※1)。

カラムファミリの変更を行った場合,現状のCassandraは再起動が必要になります※2)。

カラムファミリのデータ構造は,カラムを入れる場合と,スーパーカラムを入れる場合で若干異なってきます。カラムファミリにカラムを入れる場合,以下のようなデータ構造になります。

ColumnFamily
keybyte[]
valueColumn[]

この場合,SuperColumnと同一のデータ構造になります。

一方,カラムファミリにスーパーカラムを格納する場合,データ構造は以下のようになります。

ColumnFamily
keybyte[]
valueSuperColumn[]

カラムの場合と違ってくるのは,内部に格納されるデータの位置です。

下記のように,ユーザIDごとに複数のWebサービスのプロファイルを管理するカラムファミリ「profile-group」があるとしましょう。

ColumnFamily:profile-group
keySuperColumn
shotkeyColumn:profile
hatenanamevaluetimestamp
idshot61271419252387
firstnameShinpei1271419252387
lastnameOhtani1271419252387
lastupdate2010/03/281271419252387
twitternamevaluetimestamp
useridshot61271419252387
nameShinpei Ohtani1271419252387
locationTokyo1271419252387
webhtttp://d.hatena.ne.jp/shot6/1271419252387
yone098keyColumn
livedoornamevaluetimestamp
idyone0981271419677179
titleyone098's livedoor Blog1271419677179
latesttokyo-marathon-20101271419677179
twitternamevaluetimestamp
useridyone0981271419677179
nameMasaaki Yonebayashi1271419677179
locationToyama1271419677179
webhtttp://d.hatena.ne.jp/yone098/1271419677179

このような場合,共通のカラムファミリーのキーに対して,複数のスーパーカラムからなるロウが存在します。たとえば,「shot」というカラムファミリーのキーに対して,「twitter」「hatena」というスーパーカラムのキーがあります。また,「twitter」というスーパーカラムのキーの中に複数のカラムが存在するという構造です。

このように,カラムファミリ内にスーパーカラムが入っているときは,通常のカラムファミリより一段構造が深くなります。そのため,カラムファミリ内で扱えるデータも構造ごとに集合で扱えるのが非常に便利です。

※1)
順序の維持については次回以降でご説明します。
※2)
Cassandra 0.7から動的なカラムファミリの変更をサポートするようです

著者プロフィール

大谷晋平(おおたにしんぺい)

オープンソースプログラマ。WebフレームワークT2の開発をしながらHadoop/NoSQLミドルウェアにも手を出す。最近ではもっぱらHadoop,Cassandra,Avro,kumofsなどに興味津々。

blog:http://d.hatena.ne.jp/shot6/

Twitter:http://twitter.com/shot6/