注目キーワード
  1. 技術
  2. 広告
  3. IDFA
  4. PHP
  5. WordPress

なぜ、NoSQLを使うのか(NoSQL入門)

ビックデータが近年注目されたことで、ビックデータを支える技術のひとつとして、NoSQLは当たり前のように選択肢に上がってくるようになりました。そのため、改めてNoSQLについてまとめておこうと思います。

NoSQLとは

MySQLやPostgreSQLなどのRDBでは扱いづらいビックデータに対応できるように生み出された技術で、SQLを使用しないことが大きな特徴です。NoSQLは、Not Only SQLの略です。(Yes/NoのNoではないですw)

データベースは、SQLを用いたシステムが長く利用されてきましたが、大規模データの格納や、多量のトランザクションが発生するケースについては、性能が落ちることがあるので、SQLでカバーしきれない領域を最適化するために、NoSQLを使うケースが増えてきています。

NoSQLの種類

NoSQLは、以下の3つを指します。

・キーバリュー型 KVS(Redis、Aerospike、DynamoDB、Cassandra)
KeyとValueを単位としてデータを格納していて、シンプルで応答が早い。

・ドキュメント指向型DB(MongoDB、Couchbase)
JsonやXMLのような構造を持ったドキュメントを単位としてデータを格納しています。

・カラム指向型DB
行指向型データベースと同様にテーブル構造を持ちつつ、カラム単位でデータを保持しています。行指向型DBでは不得意な列単位の大量集計や大量集計が得意です。

・グラフ型DB
ノード、リレーションシップ、プロパティによって定まるデータを単位としていて、全体でグラフを形成しています。

NoSQLの位置付け

下記に、NoSQLの位置付けを記載した図を添付しました。

レスポンスを重視するオペレーション用途で利用するケースが増えてきています。このようにNoSQLが使われるようになった理由からも分かるように、スケールアウト(大量のデータを扱うことができ、サーバの大きさ、台数に比例して拡張できる柔軟性)、耐障害性(トランザクションが必要ないため、一部のトラブルによるバグが生じにくい)、高速処理(生合成を取る必要がないため、反応が速い)ことが大きな機能になっています。

また、データベースのトレンドにも変化が現れています。

DB Enginesランキングのデータなのですが、この数年で、MongoDB、Redisが大きく伸びてきています。
https://db-engines.com/en/ranking


RDBとNoSQLの違い

SQL言語を使うか使わないかが大きな違いです。RDBは、複雑なデータ構造を持つデータの扱いを得意としている反面、データの肥大化によるデータベースの性能劣化が起きやすいです。そのため、NoSQLは、単純なデータ構造でデータ数が多いものに向いているので、データが肥大化しても性能の劣化が起きにくいです。


なぜ、NoSQLを使うのか

最近では、ビックデータがトレンドになるくらい大量のデータを扱うケースがシステム開発でも当たり前になってきました。そこで、大量のデータを簡単に取り扱えて、コストもかかりにくいNoSQLを選択するケースが増えてきました。

例えば、KVSの場合は、シンプルな使い方(キーバリュー)ができて、スケールアウトして大量なデータに対してクエリを投げたい場合に使うことがあると思いますし、ドキュメントDBの場合は、スキーマレスでJSONを扱いたい場合に使います。仮に、RTB等で使っているBidRequestは、以下のようなフォーマットを用いていますが、

全ての項目は、200以上になります。この情報は、あとあとの集計処理や分析で使うため、データを蓄積しておく必要がありますが、このデータを整形し、RDBに書き込もうとすると、処理に膨大な時間がかかります。そのため、ドキュメントDBを使います。ドキュメントDBだと、jsonデータがすんなり格納でき、クエリもある程度使うことができるため、ある程度の検索処理ができます。

このように、何でもかんでも、NoSQLを使えばいいというわけではなく、NoSQLを選択すべき時に使うことが適切だと考えています。
・極端に非定型のデータを扱うケース(ドキュメント指向DB)
・レコード単位の処理がないケース(列指向型DB)
・レコード単位の処理しかないケース(KVS)


DBをまとめてみる

少し記事は古いですが、DBの一覧です。かなり多くのDBが存在していますが、メリットデメリットを比較した上で、技術選択をしていくことが重要だと思っています。

今回、NoSQLをテーマに記載しましたが、いかに使い分けをしながらシステム開発をしていくかが大切だと思っています。シーンによって、合っているもの合ってないものがあると考えておりますので、的確な選択ができる参考になればと思います。