初心者向けにNoSQLを徹底解説
はじめに
- 「NoSQLと従来のデータベースとの違いは何?」
- 「NoSQLを開発に使うメリットはどんなのがあるの?」
以上のような疑問に答えるために、今回の記事ではNoSQLの概要や特徴、問題点や主な活用事例を徹底解説する。
今回の記事を通して、NoSQLに対する理解を深めていただければ非常に幸いである。
NoSQLとは
NoSQLは、簡単に言えばデータベースの1つである「リレーショナルデータベース」(RDB)とはまったく異なる方法でデータを処理・操作するデータベースを意味する。
RDBはデータを表形式で管理するデータベースだ。イメージとしては、Excelのようにデータを管理するものと言っていいだろう。NoSQLはそのような形式でデータを管理しない。RDBにはMySQLやSQLiteなどの代表的なデータベースが存在するものの、それらのRDB以外のデータベースを分類する言葉がNoSQLである。
なお、NoSQLは「SQLを使わない(No)」という意味ではなく「SQLだけではない」を意味している点には十分に留意する必要がある。
NoSQLの種類
NoSQLはRDBのようにテーブル構造に固定することなく、様々な形式のデータをそのまま格納できるのが最大の特徴である。NoSQLで利用できるデータモデルの例としては以下のようなものが挙げられる。NoSQLはデータの保存方法とアクセス方法によって区別される。
- キーバリュー型
- カラム指向型
- ドキュメント指向型
- グラフ指向型
RDBで利用できるデータベースはテーブル構造に固定されていたものの、NoSQLでは多種多様なデータモデルが利用できるので柔軟性に長けている。
キーバリュー型
キーバリュー型はキーと値がペアである特徴を有する、基本的かつ単純なNoSQLの形式である。キーの値は一意でなければならない。値は年齢や名前など複数の項目を持つことができ、データ毎に異なる項目を持てる。ただし、値はキーを経由してのみ参照可能だという点には注意しよう。(イメージとしてPythonのdict型、要は辞書に近い)
このデータモデルの最大の利点は単純さだ。データの抽象化が非常に簡単なので、データを分割したり問い合わせたりする操作がしやすい。キーバリュー型は大量のデータの保存が必要で、データの取得に関し複雑な問い合わせを行わないケースに向く。
カラム指向型
カラム指向型は、キーバリュー型の「値」の部分が1つ以上のカラム(列)になったもの。**年齢や名前毎にカラムを指定できるゆえ、構造はRDBに近い。**特定のカラムを抜き出して集計する処理もできる。
カラム指向形については以下の特徴がある。
- 各行に同じ列がなくてもいい
- 列を動的に追加できる
- すべての列に値がない状態でも動作する(特定のカラムの中にNULL値が入っても動作できるのがポイント)
- データを効率的に圧縮できる
カラム指向型は、後述するドキュメント指向型のように1つの行を一度の検索で取得できない。
ドキュメント指向型
ドキュメント指向型はキーに紐づくデータをドキュメント形式で格納する方式。データは主にJSONあるいはXMLで表現できる。書き方の自由度が高いので、複雑な要素を持つデータを格納できる。大量のデータにも対応できる。
GraphQLのように、IDでドキュメント全体を取り出すだけではなく、顧客の年齢などドキュメントの一部だけを取り出したり、全文検索や特定の項目だけのクエリを実行することが得意だ。
グラフ指向型
グラフ型は「ノード」と呼ばれるデータの実体と、「エッジ」と呼ばれるノードどうしの関係性を示す情報で構成されている。ノードとエッジには「プロパティ」と呼ばれる属性情報がつく。ノードをまたいだ検索でも迅速に結果を得られるのが最大の特徴。
NoSQLのメリット
高速
処理を高速に行えるのはNoSQL最大のメリットと言っても過言ではない。トランザクションを必須とせず、データの厳密な一貫性を確保しないことで迅速にデータを処理できる。NoSQLはデータ量が増えてもRDBより処理速度が下がりにくい。
それゆえ、ビッグデータなど大量のデータ処理が必要なシステムでも十分に活用できる。
格納できるデータの種類が豊富
NoSQLはRDBとは違って以下に挙げるデータも格納できる。
- 画像や音声データ、センサーログなどのような「非構造化データ」
- XMLやJSONなどのような「半構造化データ」
サーバなどの追加により性能をアップできる
NoSQLでは性能不足が生じた際、新たにサーバを追加する「スケールアウト」により性能をアップできる。次のようなリスクや問題が生じることなく、迅速かつ円滑に性能を引き上げられるのはメリットだろう。
- メモリやハードウェアの追加によるサーバ停止
- サーバの変更による停止やデータの移行ミス
- 仮想環境の場合は設定変更による停止
完全一貫性を必要としない
NoSQLでは、処理の結果が最終的に一貫性のある状態となれば可とする「BASE基準」を採用している。NoSQLは完全な一貫性を含む「ACID特性」を満たす必要はないので、高速処理の実現に大きく貢献している。逆を言えば、NoSQLはデータの一貫性が必要なシステムには不適である。
主なNoSQL
MongoDB
MongoDBは世界で最も使われているオープンソースのNoSQLデータベースである。NoSQLの中で「ドキュメント指向型」に分類される。GoogleやAmazonが提供するクラウドサービス(GCPとAWS)でMongoDB互換のデータベースが採用されるなど、世界の有名な企業で活用が進んでいる。ただし、日本語の情報や書籍はRDBと比較して圧倒的に少ないので習得するには英語力が必要である。(どのNoSQLにも言えることだが)
さらに、MongoDBは「MERN」(MongoDB、Expressjs、React、Node.jsの頭文字)などWebアプリケーションを開発する際に使われるオープンソースの組み合わせにも活用されている。
余談だが、筆者が最も推しているデータベース。設定が簡単で公式ドキュメントが非常にわかりやすく学びやすいので、NoSQLを学ぶなら最初に着手してほしい。MongoDBはSQL以外でデータベースを操作する方法について学ぶには最適のNoSQLだろう。
Redis
RedisはオープンソースのNoSQLである。NoSQLの中では「キーバリュー型」にあてはまる。最大の特徴はコンピュータのメインメモリ上でデータを管理しているので、高速にデータへアクセスできることだ。
Redisの特徴は主に次の3つ。
- メモリ上で動作する
- データを永続的に保存できる
- データベースの書き込みと読み取りにかかる負荷を分散できる(マスター・スレープ型レプリケーション機能)
- リアルタイムでのデータ更新が得意(高速にデータへアクセスすることを利用して、SNSにおける大量のフォロー・フォロワーの依存関係の処理で役立つ)
ただし、メモリ上で動作するのでメモリの負担が大きくなる点には十分に注意する必要がある。
参考サイト
- NoSQL - Wikipedia
- NoSQL Databases: a Survey and Decision Guidance - Medium
- NoSQLとは?注目される背景や種類をわかりやすく解説
- NoSQLとは?その特徴や利用するメリット、活用事例を解説
- NoSQLとはなにか?特徴と4つの種類、適するケースを解説
- Redisとはどのようなデータベース?3つの特徴や使い方についても解説 - fenet
Discussion
僭越ながらこの記事の気になる部分を以下にて指摘させていただきました.