最近、CMS刷新の会話をすることがあり、そのサイトではMongoDBを利用しているとのことでした。NoSQLについては今までRedisくらいしか使用したことがなかったので、この際、MongoDB、NoSQLについて調べてみることにしましたので、その結果をレポートします。
MongoDBとは
MongoDBとは、NoSQLに分類されるデータベースの1つです。データベースというと、一般的に知られているのがRDB(リレーショナル・データベース)です。Oracle Database、MySQL、SQLServer,PostgreSQLなどが有名です。RDB以外のデータベースを、NoSQL(Not Only SQL)と言います。
NoSQLとは「SQLだけはない(Not Only SQL)」で、「SQLに変わる存在」という意味を含んでいるそうです。
NoSQLの特徴
近年、Webサイトのコンテンツ(静止画、動画)の量は増大化し、かつ、膨大なアクセス数が集中することで、サーバーの負荷が増加しています。
RDBによるデータの管理では、サーバー台数を増やす(水平スケールアウト)が難しく、DBサーバーのスペックを高速化するしか対応手段がありませんでした。そこで、登場したのが、NoSQLでした。
NoSQLが生まれた歴史的背景からみても、NoSQLの特徴はRDBの不満を解決するものになっています。特徴を列挙してみます。
- スキーマレス
- トランザクションがない
- 水平スケールアウトが容易
注)MongoDBはテーブル結合ができます
スキーマレスとは
スキーマレスとは、スキーマがないということで、固定されたスキーマやテーブル構造を必要としません。
RDBでは、予め決めたスキーマ(テーブル)にデータが格納されます。しかし、MongoDBでは、データをJSON形式で保持します。テーブルの項目を定義しないため、アプリケーションの要件が変更になっても、データベースの構造を簡単に変更することができます。
スキーマレスであるため、リレーションという考え方もありません。
トランザクションがない、とは
RDBはACID特性を持ち、トランザクションを使用することで、データの一貫性を保ちます。トランザクションは必ず結果を返却します。成功した場合はデータが更新され、エラーになった場合は、ロールバックされ、データは元の状態に戻ります。
NoSQLはトランザクションをサポートせず「結果整合性」という考え方に基づいてデータ処理を行います。結果整合性とは、即座にデータが反映されることを前提とせず、結果的に(実際に読み込まれる時までに)一貫性が保証されていればよいという考え方になります。
また、NoSQLは、水平スケールアウト(サーバーを増やすこと)を容易に出来きます。トランザクションはサーバーを跨ぐことは出来ない、ということもありません。
水平スケールアウトが容易
RDBでは、処理能力を向上させるには、サーバーのCPU・メモリを増強させるか、リードレプリカを作成し、読み取り速度を向上させる、といった方法をとります。
NoSQLでは、サーバーをほぼ無制限に増やすことができるため、水平スケールアウトが容易と言えます。
NoSQLが得意なシステムは
NoSQLは柔軟性やスケーラビリティが容易であるため、リアルタイムでの大量データ処理、非構造化データの取り扱い、高速な読み書きが必要とされるアプリケーションなどで活用が期待されています。
具体的には、
- ソーシャルメディア(SNS等)
- ECサイト
- BIなどのデータ分析
- モバイルアプリケーション
などが挙げられます。
NoSQLであるMongoDBとは・・・
NoSQLにも色々な種類のデータベースが存在していますが、MongoDBは「ドキュメント型」データベースになります。ドキュメント型とは、JSONのようなドキュメント形式でデータを保存するという意味です。
ちなみに、JSONとは、「JavaScript Object Notation」を略した言葉で、JavaScript用に作られたテキストでのデータ形式の1つです。XMLよりも記述が簡単なため、近年、より多く使われるようになってきたデータ形式になります。
このため、JSONに似た形式のドキュメントでデータを保存・処理することから、複雑な形式のデータを扱いやすく、ドキュメント形式であるため、動的かつ柔軟に扱うデータの形式を変えることもできます。
MongoDBの名前は、英単語の『humongous』(ばかでかい、巨大な)に由来しています。そのことからも、大容量のデータを扱いのに適したデータベースと言えるかもしれません。
また、MongoDBはMongoDB社(元 10gen社)が開発し、オープンソースとして提供されています。
最後に
NoSQL、MongDBについて調べてみて、システムが扱うデータの特定を見極め、RDBが良いのか、NoSQLが良いのか、はたまた、RDBとNoSQLの両方を利用するのがよいか、を検討することが良いのだと思いました。
次回は、MongDBをローカルに構築し、データのやり取りの方法を確認してみたいと思います。