📑

NoSQLについて

2023/05/15に公開

はじめに

NoSQLのデータベースを触る機会がありそうだったので、まとめてみる。
※GoogleのFirebaseのデータベースがNoSQLだったため

NoSQLとは

NoSQLは「Not Only SQL」の略称で、基本的にリレーショナルデータベース(MySQLやOracleDatabaseなど)以外のデータベース全般を指す。

SQLとNoSQLの違い

SQL

SQLを使用しているリレーショナルデータベースは表形式のデータ構造を持ち、関連付けをすることで複雑なデータ管理を可能とする形式となっている。
テーブル1

名前 年齢 所在地コード
Aさん 26 01
Bさん 23 02

テーブル2

ID 地名
01 北海道
02 東京

上記のような形でIDなどのキーでデータを正規化し管理、必要であればテーブル同士を結合して情報を取得できる。

またトランザクションという処理単位で処理を行っているため、最新のデータが常に参照可能となり、データの整合性が保たれる。

NoSQL

リレーショナルデータベースとは違って、表形式の構造を持たず、データの整合性が完全には担保されない代わりに、データの処理速度が高速になっている。
また、構造化データ(ExcelやCSVなどの構造が整形されたデータ)以外も扱え、近年のビッグデータ処理を行うために注目されているらしい。
構造化データ以外とは、画像や動画などのデータを指す。

NoSQLの構造は大きく4種類存在している。

キーバリュー型

一意なキーに対して、値が存在している形式。
値は複数の項目を持つことができ、辞書型の構造に似ている。
値の項目に関しては、キーごとで一致している必要は無い。

キー
Aさん {年齢:26, 所在地:北海道、趣味:ゲーム}
Bさん {年齢:23, 所在地:東京、好きな食べ物:カレー}

構造がシンプルであるため、高速に処理でき多くのデータを保存するのに適している。
ただし、複雑な検索には適していない。

主なデータベースは、RedisやDynanoDBなど。

カラム指向型

キーバリューの値の部分が1つ以上のカラム(列)になった形式。
見た目はリレーショナルデータベースと似ている。
リレーショナルデータベースと違って、動的にカラムを追加することができ、行ごとに列の数は自由となる。

キー カラム
Aさん ここに年齢・所在地・趣味のカラムがあるイメージ
Bさん ここに年齢・所在地・好きな食べ物のカラムがあるイメージ

キーバリュー型と違って、列単位でのデータの処理を行えるため、検索・集計処理を得意とする。
行単位で列は自由ではあるが、例えば上記だと年齢に絞って検索や集計等が行える。

主なデータベースは、CassandraやBigTableなど。

ドキュメント型

キーに紐づくデータをドキュメント(JSONなど)の形式で管理できる。
複雑なデータの持ち方(階層構造)なども持つことが可能。

ドキュメント形式の複雑なデータをそのまま扱えるのがそのままメリットになる。
Webのやり取りはJSON形式が標準であることが多いため、Webでの取り扱いに適している。

{
  "Aさん": [
    {
      "年齢": "26",
      "趣味": "ゲーム",
      "タスク": {
                  "A" : "明日まで",
                  "B" : "明後日まで",
                  "C" : "1週間後",
		}
    }
  ],
  "Bさん": [
    {
      "年齢": "111.18",
      "好きな食べ物": "109.75"
    }
  ]
}

主なデータベースは、MongoDBなど。

グラフ型

ノード、エッジ、プロパティの3つの要素でデータ同士の関係性を表現している、グラフ理論に基づいた形式。

ノード:Aさん、Bさんの各1まとまりの情報
エッジ:Aさん、Bさんの関係性
プロパティ:Aさん、Bさんの情報(年齢や部署など)

ノード同士が関係性を持つ、経路探索や購入履歴からのリコメンドなどの場合に有用。

主なデータベースは、Neo4jやJanusGraphなど。

使い分け

NoSQLには厳密な整合性が取れないため、正確に情報を管理しなければならない場合(勘定系や在庫管理など)はリレーショナルデータベースでの管理が適切。
逆に大量のデータを素早く捌かなければいけない場合(ビッグデータや時系列データのリアルタイム処理)はNoSQLが適している。

Discussion