NoSQLとRDBの違い
これまでのデータ処理の主役はRDBです。IT技術者はRDBの概念を理解して、SQLステートメントを駆使してデータ処理を行ってきました。NoSQLは、データ処理を行うための仕組みですが、RDBとは大きく異なります。混同すると後に手痛い倍返しに会うこともあります。その点を意識して、NoSQLとRDBの違いについて解説します。
データ構造の違い
RDBは、現実に存在する複雑なデータを取り込んで処理することを目指しています。関連性に着目して、テーブル同士をリレーションで結び付けるのです。複雑なデータ構造をリレーションで整理することによって、構造的に重複をなくしてデータ量を抑えます。これが、データの正規化です。
それに対してNoSQLは、単純な構造の大量データを高速に処理することを目指しています。リレーションという概念は、ありません。単純な表形式のデータがあるだけで、関連性がないのです。データの重複などは気にせずにレコードに格納します。
機能面とスピードの違い
RDBは、ACIDの実現を追求しているといっても過言ではありません。大量の同時処理があってもデータの一貫性を担保する必要があります。そのために、ロック単位を小さくすることで、影響範囲を小さくしてきました。このような機能は、非常にコスト(手間)が掛り、性能に悪影響を及ぼします。
NoSQLは、ACIDの実現を追求していません。そのため、命令の到達順に処理が実施されます。例えば、同一データに対する更新も配慮することなく、命令の到達順で処理されるだけなのです。ロックという概念がなく、次々とリクエストを実行するのみです。その割り切りが、処理スピードの速さです。
では、ノード間で同一keyで異なるデータが存在する場合、どのように解決するのでしょうか。Cassandraは、データにタイムスタンプを自動的に添付します。同一keyで、データが異なる場合には、タイムスタンプを比較して新しい(最近のもの)を採用します。他のデータは、新しいタイムスタンプのデータに置き換えられます。
NoSQLとRDBの選択
選択のポイントは、2点です。1つは、データ量と処理時間です。億単位のレコード数をミリ秒単位で処理したいなど、RDBでは荷が重い場合にはNoSQLを選択すべきです。
2つ目は、ACIDの要求レベルです。ACIDを考慮する必要があるのであれば、RDBを選択すべきです。ACIDをNoSQLに求めるのは、無理があります。アプリ側で、回避できるのであれば別ですが、そうでなければRDBに任せるのが無難です。
Cassandraの特徴
前置きはここまでにして、Cassandraの解説に話を進めます。Cassandraは、分散処理に対応したNoSQLタイプのデータシステムです。データと処理がノードに分散するためにノードの追加によってデータ量と処理能力がスケールします。Cassandraの特徴を順番に紹介します。
データ構造
Cassandraは、最大で5次元のデータ構造を取り扱えます。Cassandraは、NoSQLの中でもKey-Valueストアに分類されるのですが、より複雑なデータ構造を取り扱える特徴があります。
例えば、商品データを格納する場合には、次のように使用します。RowKey内のColumnは、揃っている必要はありません。また、Columnには、Timestampが付属します。Keyspaceは、ColumnFamilyを格納するための箱のイメージです。
| ColumnFamily:ItemList | |||
| Rowkey:ItemID | Column | ||
|---|---|---|---|
| Z001 | Name | Value | Timestamp |
| ItemName | チョコレート | 1271419252387 | |
| ItemColor | ホワイト | 1271419252387 | |
| LastUpdate | 2012/10/01 | 1271419252387 | |
| RX01 | Name | Value | Timestamp |
| ItemName | バームクーヘン | 1271419252387 | |
| ItemSize | 250g | 1271419252387 | |
| LastUpdate | 2012/10/01 | 1271419252387 | |
Cassandraでは、SQLライクで操作できるCQLを提供しています。CQLでは、RDBと非常に近い感覚でテーブルを構築/処理できます。CQL3では、RDBと同様にTable内のすべてのRowが同一のColumn構成です。
| Table(ColumnFamily): | ItemList | |||
|---|---|---|---|---|
| Rowkey | Column | |||
| ItemID(PRIMARY KEY) | ItemName | ItemSize | ItemColor | LastUpdate |
| Z001 | チョコレート | ホワイト | 2012/10/01 | |
| RX01 | バームクーヘン | 250g | 2012/10/01 | |
