NoSQLとは
求人票を眺めているとMangoDB, RedisなどのNoSQLも徐々に増えてきています。いっぱしのエンジニアとしてNoSQLを知らないのはまずいな、、、と思い改めて調べることにしました。
NoSQLとは
NoSQL(Not only SQL)は特定のデータモデルに特化したデータベースを指しており、
RDB特有の正規化を行わない非正規化テーブル全般を指します。正規化とは行列で形成したデータ同士の関係性構造を指しますが、NoSQL全般にはこの概念がありません。
NoSQLでは非正規かとしてテーブル間の関係性をある程度排除することで低レイテンシー、大容量のデータボリューム、柔軟なデータモデルなどを実現しています。
NoSQLの特徴
- 柔軟性
RDBMSでは、要件定義時に定めたテーブル構造でかっちりと固定されデータベーススキーマとして明示的に編成される必要もあり簡単にはスケールしづらいです。しかしNoSQLでは、構造化、準構造化、非構造化データ関係なく様々なデータを扱うことができます。
- スケーラビリティ
RDBMSでは、チューニング以外の方法で改善しない場合スケールアウト(物理サーバを増やす)が難しくスケールアップ(物理的なサーバ機能増強)が必要となりますが、NoSQLは比較的容易にスケールアウトが可能となっています。
- 高性能
NoSQLは、一般的にRDBMSよりも高性能とされています。
理由としてはシンプルな機能のつくりによるもので、整合性を保つためのトランザクションという概念がNoSQLにはありません。
よって、他プロセスと同期をとらず処理がされるため処理分担された場合などRDBMSを上回るパフォーマンスが発揮できます。
- 高機能
どのようなデータが発生しても、データベースのメンテナンスなしで柔軟に登録・検索が可能です。例えば、ドキュメントデータベースなどはJSON形式で保存するためどのような形式でも保存・利用できます。
一方でRDBで行える集計・ソート・データソース間の結合(JOIN)は対応していないものもあります。しかし、これらは適切なNoSQLの製品を選べばさほど問題にはならないと思われます。
- ACID特性がない
RDBではACID特性というものがあります。
Atomic(原子性)
Consistency(一貫性)
Isolation(独立性)
Duravility(永続性)
NoSQLでは上記特性をある程度犠牲にすることによってスケーラビリティ・高性能化を実現しています。(例、トランザクション使わない、メインメモリで処理など)
NoSQLのタイプ
- Document Store
ドキュメントデータベースは、データをJSON(JavaScript ObjectNotation)のような軽量のデータ交換フォーマットで保存します。ドキュメントモデルを利用することで簡単にデータを保存・取得することが行えます。
- Column Store
RDBではデータを行で保存しますが、このタイプはデータテーブルを列で保存します。
単純にデータ構造が逆になっただけ?とも思いましたが、例えばワイドカラムストア型であれば、列方向の集約が拘束で集計処理が得意でありIoTなどセンサー機器系の処理に向いているとされています。
- Graph Database
グラフデータベースは、ノードを使用してデータエンティティを保持することでリレーションシップを保持できます。リレーションシップ(関係性)を指定すると、つながりのあるデータを参照できるとのこと。また、保持できる所有権・ノード・アクションなどに制限はありません。(一瞬考え方的にブロックチェーンが頭をよぎったのですが、関係はないですね。)
- Hybrid Cache Store
KVS(キーバリューストア)ですが、Keyとバリューだけを組み合わせる単純構造のデータモデルです。これは単純な構造ゆえ柔軟性が高く高いスケーラビリティがあります。また、シンプルなため分散処理で処理がしやすく高速でデータ読み書きが可能です。
しかし一方でトランザクション処理ができないものも多いです。
NoSQLの種類
MongoDB
ドキュメントデータベースの一種、C++で作られたDBで提供はMongoDB Inc.
現時点での最新版は4.2.3
DB, Collection, Object(document)を操作する。ObjectはJSON形式のデータでスキーマレス(項目定義不要)に扱うことができる。
MongoDBではトランザクションとリレーショナル(JOIN)は実装していませんが、デッドロック考慮が不要で高いパフォーマンスが発揮できます。
Redis
Redisはキーバリュー型データベースの一種。提供はRedis Labs
C言語で作られている。またキーバリュー型データベースとしては最も人気のあるデータベース。インメモリDB(データストレージをメインメモリで管理)のため、非常に高速である。またシングルスレッドであるため自動的に排他制御処理となる。
インメモリDBだとデータ永続性はどうか?と考えたがこれはSAVEコマンドの実行やsnapshotの保存によりカバー可能
ElasticSearch
こちらもRedis同様キーバリュー型データベースの一種。提供はElastic社
Javaで作成されている。しばしばRedisと比較される。
これは全文検索に特化したデータベースでありJSON形式で保存されたデータを検索可能なインデックスなどを追加する、データを可視化してダッシュボードを構築できるなど機能が提供されています。
Cassandra
cassandraはカラム型データベースの一種、提供はApache(以前はFacebookで開発)
開発言語はJava
cassandraはCQL(Cassandra Query Language)が利用でき、SQL同様リレーショナルDBと同じ感覚で利用できます。 また、Amazon DynamoDBの技術を強く継承した作りで分散処理・スケールアウトに注力しています。複数サーバを起動すると自動的にクラスタが作成されるようにすることもできます。
また、ビッグデータ分析のミドルウェア(Daga Dog, New Leric)などと併用されることが多いです。
HBase
Hbaseもカラム型データベースの一種です。提供はApache、開発言語はJava
HabseはFacebookによると以下の特長があります。
・負荷に対して非常に高いスケーラビリティと性能を発揮
・Cassandraよりもシンプルな一貫性を持つ
・自動ロードバランス、フェイルオーバー、圧縮機能
・サーバーごとに数十個のシャードを割り当て可能
→シャードとは、データを複数の独立した物理データベース間に水平にパーティション化するデータベースのスケール・テクニックであり、この構成の各物理データベースをシャードと呼称する。
CouchDB
CouchDB(カウチディービー) はドキュメントデータベースの一種。提供はApache
開発言語はErlang
管理画面としてFutonが付属している、JavaScriptが使えたりやWebサーバを提供していたりオールインワン環境として使うことができる。
データベースとの通信にはHTTPを使用し、RESTful APIを提供します。
Neo4j
Neo4jはグラフ型データベースの一種です。開発元はNeo Technology社
開発言語はJavaです。
クエリ言語としてCypher QLを提供しています。この実行結果により結果値をデータとして受け取るかグラフとして取得するか決められます。
NoSQLとしては珍しくACID特性を持ちます。
参考
NoSQL とは?
NoSQLについて勉強する。
グラフデータベースとは?