NoSQL(一般に "Not only SQL" と解釈される)とは、関係データベース管理システム (RDBMS) 以外のデータベース管理システムを指すおおまかな分類語である。関係データベースを杓子定規に適用してきた長い歴史を打破し、それ以外の構造のデータベースの利用・発展を促進させようとする運動の標語としての意味合いを持つ。関係モデルではないデータストアの特徴として、固定されたスキーマに縛られないこと、関係モデルの結合操作を利用しないこと、水平スケーラビリティが確保しやすい事が多いこと、高度なトランザクション処理を利用できないものが多いことなどが挙げられる。学術的な世界では、この種のデータベースのことを構造型ストレージ (structured storage) と呼ぶことが多い[1][2][3][4]。
NoSQL系データベース管理システムは、データの格納および取得が高度に最適化されているものが多い。その最適化のために機能性を最小限にしているものもある。その最たる例が、「値」およびそれを取得するための「キー」だけを格納できるKey-Value型データベースである。NoSQL系データベースは、関係データベースのような汎用性は欠くものの、その制約された条件下ではRDBMSより高いパフォーマンスを持つ。そのためビッグデータ系ソリューションでしばしば活用される。
NoSQL系データベース管理システムが有用な場面は、関係モデルを必要としないデータを扱う時や、大量のデータを扱う時である。用途は多様であり、数百万のkey-valueペアを格納したり、数10個程度の連想配列を格納したり、数百万の構造的データを格納したりと、様々に使われる。この構造は、大規模なデータを統計的に解析したり、増えつづける情報をリアルタイムに解析するのにも便利である。
産業界での有名な実装として、GoogleのBigTable、アマゾンのAmazon DynamoDBなどがある。オープンソースの実装も数多く存在し、例えばMongoDB、Redis、Apache HBase、Hypertable[5], Apache Cassandraなどがある。
NoSQLという用語は1998年、SQLインタフェースを持たない軽量な関係データベースのオープンソースソフトウェアの名前として最初に用いられた。その著者Carlo StrozziはNoSQL運動について、「関係モデル全体と一線を画すものであるから、『NoREL』などと名づけられるべきだった」と主張している[6]。この用語は、Last.fmのJohan Oskarssonの呼びかけによって2009年初頭に開催されたオープンソースの分散データベースについての会合において、Rackspaceの従業員Eric Evansによって再導入された[7]。この名前はMySQL、MS SQL、PostgreSQLなど関係データベースのシステムで広く用いられていた命名法を参照して付けられたものであり、ACID保証を提供しないような非関係型の分散データストアの勃興を表現する意図が込められていた。
NoSQL運動が普及するに従い、その名前のもつネガティブな印象(SQLは不要である、など)が問題となり議論が起こっている。Eric EvansはNoSQLをNot only SQLのバクロニムとして理解するのが好ましいとしている[8]。
現代的な関係データベースは、小規模の高頻度なトランザクションか、巨大だが書き込みをほとんど伴わないトランザクションに最適化されて設計されているため、近年必要とされてきている大規模データに基づく (data-intensive) 応用事例では性能が劣化してしまう[9]。そのような応用の例として、検索のための文書のインデキシング、トラフィックの高いウェブサイトのサーバ、ストリーミングデータの配布などがあり、Diggのgreen badge[10]、Facebookのインボックスの検索、eBayのシステム全体などがその実例である。
NoSQLのアーキテクチャにおいては、結果整合性のみを保証するなどして一貫性の保証を弱く設計したり、トランザクションをひとつのデータアイテムに限るという制限を設けたりすることが多い。補助的なミドルウェアの層を付加することによって完全なACID保証を提供している場合もある[11]。
いくつかのNoSQLシステムは分散アーキテクチャを採用している。そのようなシステムでは、多くの場合は分散ハッシュテーブルを用いて、データを複数のサーバに冗長性を持たせながら配置する。これにより、サーバを追加するだけでシステムを容易にスケールアップさせることができ、障害への耐性も強くなる[12]。
NoSQL には、主要なものとして、以下のものがある[13]。
名称 | 言語 | 補足 |
---|---|---|
BaseX | Java, XQuery | XMLデータベース |
Cloudant | Erlang, Java, Scala, C | JSONストア(オンラインサービス) |
Clusterpoint | C++ | XML, 全文検索 |
Couchbase Server | Erlang, C, C++ | JSONとバイナリドキュメント |
Apache CouchDB | Erlang | JSONデータベース |
djondb[14][15][16] | C++ | JSON, ACIDドキュメントストア |
Solr | Java | サーチエンジン |
Elasticsearch | Java | JSON, サーチエンジン |
eXist | Java, XQuery | XMLデータベース |
Jackrabbit | Java | Java Content Repository実装 |
IBM Lotus Notes and IBM Lotus Domino | Lotus Script, Java, IBM X Pages, その他 | MultiValue |
MarkLogic Server | XQuery, Java, REST | JSON対応のXMLデータベース, テキスト, バイナリ |
MongoDB | C++, C#, Go | BSONストア(JSONのバイナリフォーマット) |
ObjectDatabase++ | C++, C#, TScript | C++ネイティブクラスのバイナリ |
Oracle NoSQL Database | Java, C | |
CoreFoundation Property list | C, C++, Objective-C | JSON, XML, バイナリ |
Sedna | XQuery, C++ | XMLデータベース |
SimpleDB | Erlang | オンラインサービス |
TokuMX | C++, C#, Go | MongoDBとフラクタルツリーインデックス |
OpenLink Virtuoso | C++, C#, Java, SPARQL | ミドルウェアとデータベースエンジンのハイブリッド |
名称 | 言語 | 補足 |
---|---|---|
OrientDB | Java | JSON, SQLサポート |
ArangoDB | C++ | |
FoundationDB |
名称 | 言語 | 補足 |
---|---|---|
AllegroGraph | SPARQL | RDFグラフストア |
IBM DB2 | SPARQL | RDFグラフストアを追加したDB2 10 |
DEX/Sparksee | Java, C++, .NET, Python | ハイパフォーマンスグラフデータベース |
FlockDB | Scala | |
InfiniteGraph | Java | ハイパフォーマンス, スケーラブル, 分散型グラフデータベース |
Neo4j | Java | |
OpenLink Virtuoso | C++, C#, Java, SPARQL | ミドルウェアとデータベースエンジンのハイブリッド |
Sones GraphDB | C# | GraphQLと呼ばれるクエリー言語を備えたグラフデータベース |
Sqrrl Enterprise | Java | セルレベルのセキュリティに特化した分散型, リアルタイムグラフデータベース |
OWLIM | Java, SPARQL 1.1 | 推論付きRDFグラフストア |