NoSQLとRDBMSの比較
さて前回ご紹介したNoSQLの特色ですが、もう一度書きますと、
- データ構造が単純である
- リレーションがない
- 拡張性/柔軟性が高い
- トランザクションがない
- 分散環境への対応が容易
ということでありました。
これらはどういうことなのか、改めてRDBMSと比較してみてみたいと思います。
データ構造とリレーション
RDBMSの場合
RDBMSはデータをテーブルという表形式に集約し、データ同士の関係性を定義することで厳格なデータモデルを表現しています。テーブルはデータモデルごとに作成され、カラムという単位で項目を分けていきます。カラムはデータ型を指定する必要があり、投入されるデータの意味を理解した上で定義しなければなりません。
また、データ同士の関連性を定義することで、論理的な整合性が担保されます。
このように厳密でありますが、同時に複雑なデータ構造を表現することが可能となります。
NoSQLの場合
データ構造はハッシュ構造や連想配列のような構造をとることが多く、いわゆるキーバリュー形式と呼ばれるキーとバリューの組み合わせでのみ表現されます。非常に単純ですね。データ型の定義などもありません。
また、データ同士の関係性も定義ができません。
拡張性/柔軟性
RDBMSの場合
RDBMSはデータ構造をあらかじめ定義する必要があるため、拡張性/柔軟性は低いといえます。テーブル定義の変更やカラム定義の変更などは、コストがかかる作業となります。
NoSQLの場合
データ構造を最初から定義する必要がない、そもそもバリューの中になんでも入れるということも可能です。厳密なデータ定義がありませんから自由です。自由すぎる…。
トランザクションについて
トランザクションはDBMSでのデータ処理の最小単位として使われますが、一般的にRDBMSはACIDが実装されているため、データの不整合が発生しないようになっています。
よく例として出されるのが銀行振り込みのシステムです。
RDBMSの場合
トランザクションはACIDによって処理前か処理後の状態にしかならないことを保証しています(Atomicity:原子性)。また、独立性(Isolation)も保証されているので、トランザクションの②と③の間は第三者から参照されることはありません。障害が発生した場合は、処理前の状態に戻されます(Durability:耐久性)。
ついでに書いておくと、一貫性(Consistency)は②と③の処理が逆でも結果は同じというとトランザクションの一貫性を表しています。
NoSQLの場合
トランザクションがまったくないわけではなく、製品によっては徐々に実装されつつあるようです。しかし、RDBMSのACIDように堅牢なものではなく、Eventual Consistent(最終的な一貫性)という実装となっています。
これは次の分散環境への対応につながる話ですが、多数のサーバにデータのコピーを分散させるため、ある更新がすべてのサーバに行き渡るまでの間、更新前のデータが検索できてしまうことを意味します。つまり、すべての更新が行き渡ったときに(最終的には)一貫性が保たれるということです。まさに緩やかなトランザクションですね。
分散環境への対応
RDBMSの場合
レプリケーションという機能を使うことで複数のサーバにデータの複製をすることが可能です。これは、耐障害性を向上させる強力な方法ですが、データに不整合が発生した場合やレプリケーションを追加したい場合など運用上の負荷やコストが大きくなることが想定されます。
NoSQLの場合
分散フレームワークを使用することによって簡単に対応できるようです。
分散環境への対応は
- 耐障害性
- 高いパフォーマンス
- 大容量データを容易に扱える
という面において大きな効果を生み出しています。
緩やかなトランザクションのおかげで、物理的に(ネットワーク的に)近いサーバから優先的に結果を取り出すことができます。
まとめると……
このように比較をしていくと、NoSQLの特色というのは、以下のような言葉で置き換えられると思います。
- データ構造が単純である
- リレーションがない
- トランザクションがない→シンプルな設計、シンプルな機能
- 拡張性/柔軟性が高い→スケーラビリティの向上
- 分散環境への対応→アベイラビリティの向上
RDBMSとはずいぶんと違うNoSQLですが、今後は実際に動作させてみて違いを感じたいと思います。