#とりあえずNoSQLとは
NoSQLとは、一般にNot only SQL(非リレーショナルデータベースシステム)の略称であり、DBの1つのカテゴリとして分類されます。また、DBはRDB(リレーショナルデータベース)とNoSQLに分けることができ、
RDBはSQL言語を用いてデータを書き出しや検索をするDBで、MySQLやPostgreSQLなど当てはまります。
#RDBとNoSQLの比較
##データの持ち方と参照方法
###RDB
データの構造を表形式で定義し、その構造に基づいてデータを保管したり検索したりすることができます。
SQLなどのデータベース言語を用いて、複数の表から関係のあるデータを参照するなど高度な条件でのデータを閲覧可能です。
例:MySQLやPostgreSQL
###NoSQL
一言にNoSQLと言っても、一律に同じデータ保有の仕方ではなく、何種類かの「型」に分けられます。
下記に挙げるのは一例であり、グラフ型などまだ様々な型があります。
Key-Value型
RDBのようなテーブルや関係性を定義せず、キーとバリューという組み合わせからなるシンプルなデータモデルです。データが増えるにつれて表が縦の方向に伸びていくイメージです。スケールアウト(=サーバーの「台数を増やす」ことによる容量拡張)して処理を分散することで、ビックデータに対するCRUDに短い時間で応答できます。
例:RedisやRiak
カラム指向型
上記のキーバリュー型にカラムの概念を持たせたデータモデルです。
行に付与されたキーが複数のカラムを持つことができます。
カラム数はRDBのように固定ではなく、動的に追加していくことができます。
RDBを利用していると異質に思えるかもしれませんが、ほかの行には存在しないカラムを持つ行を作ることができます。
例:CassandraやHBase
ドキュメント型
JSONやXMLなどのドキュメント形式のデータをそのまま格納することができるデータベースです。
Key-Value型データベースに比べて, 階層構造など柔軟なデータ構造に対応が可能です。
1件分のデータを「ドキュメント」と呼び、個々のドキュメントのデータ構造は自由で、データを追加する都度変えることができます。リレーショナルデータベースとは違って、事前にテーブルの構造を決めておく必要がありません。(スキーマレス)
例:MongoDBやFirestore
下記の図はドキュメント型のイメージ(firebase/firestore)ですが、前述した通り、この型にはめられているわけではありません。ドキュメントごとにカラムを変えたり、データ型を変えたりすることもできます。
##処理速度
###RDB
システムの特性や規模にもよりますが、強固なトランザクション処理を行うため、それほど速くはないというのが通説です。
###NoSQL
トランザクション自体が存在せず、他のプロセスと同期を取らずに読み書きが行われるため、
大量のデータを扱うサービスで参照や追加処理が主な処理である場合、高速となります。
データ構造の特性上、更新や削除処理にはそもそも向きません。
##トランザクション
###RDB
アトミック性、一貫性、分離性、および耐久性 (ACID) の特性があります。
アトミック性:トランザクションは必ず、完全に実行されるか、まったく実行されないかのいずれかになります。
一貫性:いったんトランザクションが実行されたら、データが必ずデータベーススキーマに従うことを指します。
分離性:同時発生したトランザクションが相互に独立して実行されることを指します。
耐久性:予期しないシステム障害や停電が発生しても、異常発生前の最後の状態まで復旧できることを指します。
つまり、銀行でお金を引き出す際にエラーが発生し、お金を引き出すことができなかったが、口座残高が減っている。という処理の途中で終了することはなく、途中でエラーが出たらロールバックして初期の状態に戻すことで、銀行側と顧客側どちらか一方が損をすることはないように作られた仕組みがトランザクションであり、RDBにはこの仕組みが採用されています。
###NoSQL
一方NoSQLでは基本的にはトランザクションは存在しません。
サーバーを増やし、スケーラビリティー(水平分散)することができますが、データの整合性は保証されておりません。
##じゃあ、NoSQLのデータ設計は?
・リレーションを組んでおらず、joinリクエストができないので一度にデータを取得できるようにデータを持つ
・データを重複して持つことを許容する
・データを更新する場合は重複したデータに対してそれぞれ更新リクエストをかける
どの点もRDBではNGとされる設計だと思います。NoSQLの特性上、
スピード感を持ってDBとのやりとりができるようなシンプルな設計が好まれます。
#簡単にまとめると
RDBMSはスキーマをしっかりと定義しリレーションを組むので複雑なデータに向いているが、
データ量が肥大化するとスピード感が失われてしまう。
NoSQLはスキーマを定義する必要がなく、必要なデータを自由に保存できる。
単純なデータに向いており、データが肥大化しても性能劣化が起こりづらいが、複雑なデータは苦手である。
##参考
https://www.footchantech.com/post/nosql
・https://tracpath.com/works/development/nosql_overview/
・https://qiita.com/kubocchi/items/e123cffc518c402b399b