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

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

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

前回までの説明でCassandraのインストールと動かすところまでいきました。今回はCassandraのデータモデルを理解して,実際にデータにアクセスしてみましょう。

データはすべて4次元または5次元の連想配列

Cassandraのデータは非常にシンプルなデータモデルを持っています。データはすべて4次元または5次元の連想配列のようになっています。

4次元の場合は以下の形で値にアクセスします。

[キースペース][カラムファミリ][キー][カラム]

そして5次元の場合は以下の形でデータを特定します。

[キースペース][カラムファミリ][キー][スーパーカラム][カラム]

Cassandraのデータモデルは以下の4つの概念で成り立っています。

カラム:
データの最小単位。実際のキーと値,そしてタイムスタンプを持つ。
スーパーカラム:
カラムの集合を扱う単位。
カラムファミリ:
カラムまたはスーパーカラムの集合を扱う単位。RDBMSでいうところのテーブル。
キースペース:
RDBMSでいうところのデータベース。一般に1アプリケーションで1つ使用する。

1つ1つ見ていきましょう。

カラム ─データ構造の最小単位

カラムとは,Cassandraで扱うデータ構造の最小単位です。どのデータも,カラムによって以下の項目を保持しています。

  • name:カラムにアクセスするためのキー
  • value:カラムの値
  • timestamp:カラムの更新日時

これらの値はすべてアプリケーションから与えられるもので,Cassandra側では何も足したりはしません。これを図示すると,以下のようになります(カッコ内はデータ型)。

Column
name(byte[])value(byte[])timestamp(long)

これがもっとも基本的なデータ構造になります。たとえばカラム「twitter」があるとして,その値が「shot6」の場合,以下のようになります。

Column:twitter
twittershot61271419252387

スーパーカラム ─カラムの集合を扱う

スーパーカラムはカラムの集合を扱うデータ構造です。複数のカラムを束ねて,1つのキーでアクセスできるようになります。スーパーカラムのキーに対して,値が〈カラム名,カラム〉の,ソート済みのマップのようなデータ構造と思ってください。

スーパーカラムは以下の項目を保持しています。

key:
このスーパーカラムにアクセスするためのキーです。
value:
このスーパーカラムで保持するカラムの配列です。

スーパーカラムはタイムスタンプを持たないのが特徴です。使い方としては,以下のようになります。

  • スーパーカラムのキーでカラムの集合を特定する
  • 第2のキーとして,カラム名でカラムを特定する

データ構造を図示すると以下のようになります。

SuperColumn
keybyte[]
valueColumn[]

具体例で見てみましょう。

複数Webサービスのプロフィールを表現するスーパーカラム「profile」があるとします。各サービス名をSuperColumnのキーとする場合,たとえば以下のようになります。

SuperColumn:profile
keyColumn
hatenanamevaluetimestamp
idshot61271419252387
firstnameShinpei1271419252387
lastnameOhtani1271419252387
lastupdate2010/03/281271419252387
twitternamevaluetimestamp
useridshot61271419252387
nameShinpei Ohtani1271419252387
locationTokyo1271419252387
webhtttp://d.hatena.ne.jp/shot6/1271419252387

この場合,「hatena」というキーを持つデータに注目してみましょう。「hatena」というスーパーカラムは,「id」「firstname」「lastname」「lastupdate」という4つのカラムが返ってきます。このようにスーパーカラムは複数のカラムを持つことができるのです。

では次に,「twitter」というキーを持つデータに注目してみてください。こちらは「userid」「name」「location」「web」というカラムを持ちます。 あれ? おかしいですね。先ほどの「hatena」というキーが持つカラムの内容が明らかに違っています。

実はCassandraではカラムファミリごとに異なるカラムを持つことができます。カラムは実行時に追加できるので,設定ファイルで決め打ちにしておく必要がありません。カラムの変更でCassandraのサーバを再起動しなくても済むのです。

著者プロフィール

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

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

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

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

コメント

  • 3年間放置されてるバグ

    「実はCassandraではカラムファミリごとに異なるカラムを持つことができます。カラムは実行時に追加できるので,設定ファイルで決め打ちにしておく必要がありません。」
    カラムファミリじゃなくてスーパーカラムの間違いですよね。指摘がなかったのか、指摘されても直してないのか。

    Commented : #1  コメントに名前なんか不要なんだよ (2013/10/01, 16:13)

コメントの記入