ドキュメント指向データベースと列指向データベース
ドキュメント指向データベースの概要
リレーショナルデータベースでは、データを表形式で保存します。そのため、表にしやすいデータであれば、効率よく管理することができます。
しかし、世の中全てのデータを表にできるかと言えば、そうではありません。そのようなデータをリレーショナルデータベースで管理しようとすると、どうしても無理が生じてしまいます。その結果、プログラムを組むのが難しくなったり、処理に時間がかかるようになったりしてしまいます。
このような中で、柔軟な構造でデータを扱えるようなデータベースとして、「ドキュメント指向データベース」と呼ばれるデータベースが出てきました。
ドキュメント指向データベースでは、1件分のデータを「ドキュメント」と呼びます。また、個々のドキュメントのデータ構造は自由で、データを追加する都度変えることができます(図1)。リレーショナルデータベースとは違って、事前にテーブルの構造を決めておく必要がありません。このことを「スキーマレス」(Schemaless)と呼びます。
現在ではオブジェクト指向プログラミングが一般的で、オブジェクトをデータベースに保存する場面も多いです。リレーショナルデータベースに複雑なオブジェクトを保存するには、ORM(Object Relational Mapping)等の手法を使う必要があり、プログラミングが複雑になりがちです。一方、ドキュメント指向データベースなら、オブジェクトをそのまま保存しやすいというメリットがあります。
また、ドキュメント指向データベースでは、スケーラビリティを重視した製品が多いです。大量のデータを扱うシステムを作る際に、リレーショナルデータベースと比べて、比較的簡単にスケールできるような仕組みを持っていることが一般的です。
特に、「Sharding」という仕組みに対応していることが多いです。Shardingでは、多数のコンピュータをネットワークで接続し、それらの間で情報を特に共有しないで分散処理を行う仕組みで、サーバーを増やすだけで性能を上げやすいのです。
図1:ドキュメント指向データベースでは、さまざまなデータ構造のドキュメントを混在して保存することができる |
MongoDBの基本
ドキュメント指向データベースの中で、特に注目されている製品として「CouchDB」と「MongoDB」があります。本稿では、そのうちのMongoDBを取り上げることにします。MongoDBは、アメリカの10gen社によって開発されているドキュメント指向データベースです。
C++言語で開発されていて、Windows/MacOS X/Linux/Solarisに対応したプログラムが配布されています。また、Perl/PHP/Ruby/Pythonなど、多くの言語に対応したライブラリも配布されています。
MongoDBの特徴の1つは、ドキュメントを「BSON」というバイナリ形式の内部データで保存することです。BSONは、JavaScriptの「JSON」(JavaScript Object Notation)を元にした書き方で、キーと値の組み合わせでドキュメントの構造を作っていくようになっています。
キーバリュー型のデータベースと比べると、複雑なデータ操作を行うこともできます。例えば、条件を指定してデータを検索するようなことも可能です。そのため、リレーショナルデータベースに慣れた方にも、比較的とっつきやすいNoSQLデータベースだと言えます。
もう1つの特徴として、Shardingに対応していることがあげられます。MongoDBのサーバーを複数台用意して、比較的簡単にデータベースを分散させることができ、スケーラビリティが必要なWebサービス等に使うことが考えられます。
ただし、リレーショナルデータベースとは違って、結合に相当するような機能はありません。したがって、結合を多用するような複雑なデータ処理には、MongoDBはあまり向いていないと言えるでしょう。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- データベース:サーバにデータを保存しよう
- SoftLayerでMongoDB環境を構築してみよう
- クラウドの力を引き出す分散データベース
- Foreign Data Wrapper(FDW)の機能強化
- Active Recordのその先へ ~RailsでMongoDBを使う~
- OLAPのための高速カラム指向データベースClickHouseの概要を紹介
- IoTに適したNoSQL・分散Key-Valueストア
- 「TAURI」でデータベースを使ってみよう
- NoSQLとNewSQLの技術革新、マルチテナンシーの実現と高いスケーラビリティを提供
- Web SQL DatabaseとIndexed Database API