改めてMongo DBに入門してみる (第1回)

本業でMongo DBを使い始めてしばらく経ちましたが、なんの気なしに触っていたため改めて基礎をおさらいしておこうと思い立ちました。

数回に分けて投稿する予定です。

初回はそもそのNoSQLってなんなの?ってところからコレクション・ドキュメントについての内容をまとめていきます。

NoSQLとは?

NoSQLデータベースは、従来の関係データベース(RDBMS)とは異なるアプローチでデータを管理するデータベースの総称であります。 NoSQLは「Not Only SQL」の略で、SQLに限定されないデータベース管理システムを指しています。

NoSQLデータベースは、スケーラビリティ、柔軟性、高速性に重点を置いており、ビッグデータやWebアプリケーションなどの分野で活躍しています。

まあとにかく大量のデータを扱うのに適しているよ!って話ですね。

Mongo DBの特徴と利点

ドキュメント指向型データベース

一口にNoSQLって言ってもその中でタイプが分かれているんですが、今回扱うMongoDBはドキュメント指向型データベースというタイプに属しています。

これはデータをJSONオブジェクトとして扱うことで、アプリケーションで扱うデータ構造に近い形でデータを管理することができるんですよ。

オブジェクト形式なのでキーとバリューのペアで構成されていて、値には文字列型など一般的なデータ型以外にも配列やドキュメント自体も格納できるのが特徴。

RDBMSは関連するデータをテーブルに保存してそれぞれをキーで関連付けるんですけど、ドキュメント型だと階層構造で格納できるんですよ。

{
  "_id": ObjectId("..."),
  "title": "My Blog Post",
  "content": "...",
  "author": {
    "name": "John",
    "email": "john@example.com"
  },
  "comments": [
    {
      "content": "Great post!",
      "author": {
        "name": "Jane Smith",
        "email": "jane@example.com"
      }
    },
    {
      "content": "I have a question...",
      "author": {
        "name": "Bob Johnson",
        "email": "bob@example.com"
      }
    }
  ]
}

関連データを1回のクエリで取得できるので、高いパフォーマンスを発揮します。また、データの整合性も保ちやすいのも利点です。

インメモリ

RDBは通常はディスク上で動作するみたいですが、こいつはRAMで動作するんですよ。 そのメリットってのが知る限りだと

  • ディスクよりも高速にアクセスでき、読み書きが高速
  • クエリが低遅延

になります。

とはいえRAMの容量は限られているので大量のデータを扱うには注意が必要だそうです。

気になるところ

MongoDBはスキーマレスなので、マイグレーションのようにスキーマを定義する必要はないので、柔軟性はあるもののデータの整合性を保つのに苦労しそうだなーと思いました。 あと、階層構造になっている分データが複雑になったり、どの段階で別のコレクションに分けるのかなど結構悩みそうな印象です。

コレクション

RDBでいうところのテーブルに当たります。そのため、コレクション名はusersのように複数形で命名するのが一般的です。

ドキュメント

先ほどでも触れましたがJSONに近いデータ構造なのが特徴です。RDBで言うところのレコードになります。 コレクションとの関係は、一つのコレクションに対して複数のドキュメントをもつことができるいわば親と子の関係です。

まとめ

ざっくりみてきましたが、ひとことでまとめるならスケールしやすくて高速なデータベースってところでしょうか。 大量のデータを高速に扱いたい場面に適している感じですねー

次回は使用するクエリや公式のクライアントアプリを見ていきましょう!

参考

www.mongodb.com

aws.amazon.com

atmarkit.itmedia.co.jp