Neo4j公式サイト:http://neo4j.com/
はじめに
”NoSQL”が、バズワードとして流行してから数年がたちました。すでにたくさんの製品が生まれ、主要ベンダーも次々と商用製品をリリースしています。NoSQLを取り巻く環境は落ち着きつつあり、成熟期に入っている製品も数多くあります。NoSQLを知っている方も知らない方もこのあたりで、一度NoSQLについて整理してみましょう。
この記事では、NoSQLの概要を掴みたい方のために、NoSQLの概要と主要なOSS(オープンソースソフトウェア)プロダクトを紹介していきます。これから、NoSQLを必要とする場面は増えてくるでしょう。そんな時に、アーキテクチャ設計の選択肢にするためにも、概要だけでも知っておきましょう。
NoSQLが生まれた背景
ビッグデータも、以前バズワードとして流行しました。NoSQLとビッグデータには切っても切れない縁があります。ビッグデータは、数十テラバイトから数ペタバイト以上にもなる巨大なデータなので、既存のRDB(リレーショナルデータベース)で扱うにはデータ量が多すぎました。また、ビッグデータの主なデータは、非構造化データ(テキストや画像など)と半構造化データ(JSONなど)で占められており、集合論を根底に置くRDBは不向きでした。
そこで、NoSQLデータベースが作られることになりました。正確には、NoSQL自体は2000年以前から存在しており、ビッグデータの流行とともに用途が見出され、にわかに注目が集まることになりました。NoSQLデータベースは、RDBよりもビッグデータを格納するのに向いています。それでは、どんな点がRDBよりも優れているのでしょうか?次項で詳しく説明します。
RNoSQLとDBとの違い・特性
NoSQLデータベースは、RDBとは違った特性を持っています。主な特性は、下記の4つです。
スキーマレス
RDBは、データを格納する前にスキーマを定義する必要がありますが、NoSQLデータベースではスキーマ定義なしでデータを格納することができます。TwitterなどのWeb APIが返すデータはJSONが一般的です。階層的な構造を持っていることも多く、構造が変更されることもしばしばあります。
このため、RDBにスキーマ定義をして格納することは困難です。後述する、NoSQLデータベースの一種であるドキュメントDBであれば、スキーマ定義なしでJSONをそのまま格納することができます。とはいえ、どんな構造のデータが格納されているか知っている必要はあります。そうでなければ、データを取得することはできません。明確に定義しないだけで、スキーマ自体は存在しているといえます。一部例外もあり、スキーマ定義が必須になっていたり、オプションになっていたりするDBもあります。
リレーションを持たない
NoSQLデータベースは、速度やスケーラビリティに重点を置いているため、基本的には、リレーションを持ちません。これは、リレーションによる結合が、速度やスケーラビリティに悪影響を与えるためです。もちろん、スキーマ設計上でリレーションをもたせることは可能なので、まったくリレーションを持てないわけではありません。しかし、あまりにリレーションが多くなりすぎると性能の悪化をまねいてしまいます。そんな時は、リレーションを減らすか、RDBの方が適切ではないか検討しましょう。
トランザクションがない
NoSQLデータベースのほとんどは、トランザクションをサポートしていません。サポートしているDBでも、RDBほどの強力なトランザクション機能はありません。これは、NoSQLデータベースが”結果整合性”という考え方を元に設計されているためです。結果整合性とは、一時的には整合性がない状態になるとしても、最終的には整合性が保たれることをいいます。結局のところ、NoSQLデータベースでは、アプリケーション側で整合性を維持する必要があります。厳密な整合性が必要とされる分野では、RDBの方が適しています。
スケールアウトがしやすい
データベースエンジニアの方はよくご存知だと思いますが、RDBでは性能が問題になることが多いです。チューニングでどうにかなる場合はよいですが、そうでない場合、DBサーバー自体の増強が必要になってきます。しかし、RDBはスケールアウト(水平スケール)が容易ではなく、スケールアップ(垂直スケール)に頼ることになります。スケールアップには、物理的に限界がありますから、大量のデータを処理するシステムでは性能が頭打ちになってしまいます。
NoSQLデータベースは、スケーラビリティが高く、容易にスケールアウトが可能なように設計されています。このため、大量のデータを分散して処理することができ、ビッグデータを高速に処理することが可能です。また、スケールアウトにより障害耐性も高めることができます。
NoSQLデータベースの種類(データモデル)と主なプロダクト
NoSQLデータベースは、データモデルによって分類できます。大きく分けて以下の4種類です。
キーバリュー型DB(KVS:Key Value Store)
キーとバリューをペアにして格納する、一番シンプルなデータベースです。プログラミングでいうと、連想配列やディクショナリ型のようなものですね。作成/更新時には、キーとバリューと指定し、キーを指定して読み取り/削除を行います。なお、バリューは単一の値だけでなく、リストやセットなどで複数の値を持つことができます。
・Redis
Redis公式サイト:http://redis.io/
Redisレポジトリ:https://github.com/antirez/redis
・Riak
Riak公式サイト:http://jp.basho.com/products/
Riakレポジトリ:https://github.com/basho/riak
ドキュメント型DB
JSONやXMLなどのドキュメントを、そのまま格納することができるデータベースです。RDBではスキーマ定義が複雑になりがちなJSONを、シンプルに格納できるのはとても便利ですね。作成時にドキュメント全体を格納し、読み取り/更新/削除をドキュメントの一部もしくは全体に対して行うことができます。ドキュメント型DBのひとつであるMongoDBは世界で最も使われているNoSQLデータベースで、Oracle、MySQL、SQL Serverに続き第4位(2016年4月現在)。
・MongoDB
MongoDB公式サイト:https://www.mongodb.org/
MongoDBレポジトリ:https://github.com/mongodb/mongo
・CouchDB
CouchDB公式サイト:http://couchdb.apache.org/
CouchDBレポジトリ:https://github.com/apache/couchdb
カラム型DB(列指向型)
RDBはロー(行)単位で処理を行いますが、逆にカラム型DBはカラム(列)単位で処理を行います。行を取り出すのではなく、列を取り出すといった形ですね。つまり、列単位でまとまった処理があるシステムでは、RDBよりも高速に処理できるということです。行単位で集計する処理が多い、情報分析システムなどで活用されています。ビッグデータ分析用のミドルウェアと併用されることが多いです。
・Cassandra
Cassandra公式サイト:http://cassandra.apache.org/
Cassandraレポジトリ:https://github.com/apache/cassandra
・HBase
HBase公式サイト:https://hbase.apache.org/
HBaseレポジトリ:https://github.com/apache/hbase
グラフ型DB
グラフ理論を元にしたデータベースで、データをグラフ構造で格納します。NoSQLには当てはまらないという意見もあり、一風変わった存在です。FacebookなどのSNSのユーザー同士のつながりなど、ネットワーク状のデータを格納するのに適しています。データ間の関連(リレーション)に重心を置いたデータベースといえるでしょう。
・Neo4j
Neo4j公式サイト:http://neo4j.com/
Neo4jレポジトリ:https://github.com/neo4j/neo4j
まとめ
NoSQLデータベースは、RDBと共存関係にあり、RDBを置き換えるものではありません。また、いろいろな種類があり、DBごとに特性も異なります。それぞれの特性を把握して、適材適所でしっかり使い分けができるようにしておきましょう。また、最近のRDBはNoSQLの要素を取り込んでいるので、RDBの最新情報にも目を通しておくとよいです。あなたのプロジェクトにNoSQLデータベースは活用できそうですか?
本ブログは、Git / Subversion のクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
開発の効率化をしたい!もっと便利なツールを使いたい!そんなお悩みをtracpathで解決!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
1 Comment
[…] リー構造を持つデータ(ドキュメント)をそのまま格納す流ことができるDBです。余談ですが、ドキュメント型以外には、KeyValue型、列指向型と呼ばれるタイプのNoSQLもあります。(参考) […]