データベースの種類について

データベースサービスの相違点について自分なりにまとめてみました。
まだまだAWSサービスについての知識については未熟ですが、備忘録として記事にします。
もし、データベースの相違点で思い出したいときに参考までに読んでください。

## データベースの種類
データベースの種類には大きく分けて二つあります。
データ間の関係性を定義して利用するリレーショナルデータベース。
データ間の関係性のないデータベース、データはKey,value型によるKVSデータを利用するNoSQL型のデータベース（非リレーショナルデータベース）です。

## NoSQLのタイプ
NoSQLには下記の４つのタイプがあります。

| タイプ | 特徴 |
|:--|:--|
| キーバリューストア | キーに対してバリューを入れる単純な構造。データ読み込みが高速。高速なパフォーマンスと分散型拡張に優れている。 |
| ワイドカラムストア | 列指向とも呼ばれ、キーを利用するがデータはカラムに格納する。非機能データを大規模に格納するのが目的 |
| ドキュメントデータベース | JSONやXMLなどのデータを格納。複雑なデータ構造を扱うアプリで生産性高く柔軟に開発する |
| グラフデータベース | データ同士の関係をグラフで相互に結びついた要素で構成される。RDBと比較して高速横断検索が可能。 |

# データベース各種類について

## RDB

* 概要

業務向けのDB。基本はリレーショナルデータベース。
SQLでのデータ操作が可能。

* アーキテクチャ

テーブル間のリレーショナルが定義されたデータモデル

* 利用ケース

会計データなどの業務系構造化データ

| オンプレ | AWSサービス |
|:--|:--|
| MySQL、Oracleなど | RDS |

## データウェアハウス（DWH）

* 概要

構造化データを利用した経営分析向けデータベース。
データの読み込み、集約に特化したBIデータ分析用のデータベース。
読み込むデータ構造を予め設計して、加工してから利用文のデータを蓄積
レスポンス重視でデータ抽出・集計が早いが、更新、トランザクションは遅い。

*　アーキテクチャ

データをパーティショニングして、複数ディスクから読み込む

* 利用データ

会計データなどの業務系の構造化データの分析用に加工し、BIで利用
KPI測定・競合分析・アクセス分析など

| オンプレ | AWSサービス |
|:--|:--|
| Oracle Exadata, VERTICA,TERADATAなど | Redshift |

## 分散型DB・データレイク

* 概要

ビッグデータやIOTデータを蓄積して高速処理を可能にするDBとストレージの組み合わせ。
データの抽出に特化。
分散してデータを保存しており、ビッグデータの高速処理向け。

* アーキテクチャ

SQLライクなクエリ操作可能
INSERT・UPDATE・DELETEはない
トランザクションはない
データの書き込みは一括ロードまたは全件削除のみ

* 利用データ

ビッグデータ

| オンプレ | AWSサービス |
|:--|:--|
| Impala,HDFSなど | S3 |

## KVS：キーバリュー型

* 概要

シンプルなデータ構造にすることで高速処理を可能にしたDB

* アーキテクチャ

強い整合性を犠牲にして、結果的な整合性を採用
分散むけデータモデル・クエリの採用
トランザクション・集計・JOINなどの不可

* 利用データ

大規模WEBサイトのバックエンドデータ（ユーザーセッション、ユーザー属性、事前計算データのキャッシュ）
メッセージングシステムのデータ
大規模書き込みが必要なIOTセンサーデータ

| オンプレ | AWSサービス |
|:--|:--|
| radis,riak | ElastiCache,DynamoDB |

## ワイドカラム型

* 概要

キーに対してカラムを大規模に登録できるのがワイドカラム型
分散してシンプルなオペレーションを高速に実行できるDB
データ取得する際にデータ結合しなくても済むように、可能な限り多くのデータを同じ行に保持

* アーキテクチャ
結果結合性を採用
キースペース、カラムファミリ、ロウ、カラムの入れ子構造
SQLライクなデータ操作が可能
データの更新は挿入による上書き

* 利用データ

Facebook/Twitterなどのソーシャルデータの位置情報データストレージ
リアルタイム分析
データマイニング処理

| オンプレ | AWSサービス |
|:--|:--|
| HBASE,cassandra | DynamoDB |

## ドキュメントDB

* 概要

ドキュメント指向データベースで様々なデータ構造のドキュメントを混在して保存することができる。

* アーキテクチャ

JSON/CMLをデータモデルに利用
小規模データの同期集計処理が可能だが、バッチは不向き
SQLライクなデータ操作が可能でKVSよりもクエリが豊富なため操作しやすい
Shardingによるデータベースの分散化

* 利用データ

半構造化データ（XML/JSON）
大規模WEBのログ補完など
オンラインゲームデータ
カタログ管理

| オンプレ | AWSサービス |
|:--|:--|
| mongoDB,MarkLogic,CouchDB,Couchbase | Amazon DocumentDB, mongoDB |

## インメモリデータグリッド

* 概要

大量のデータを多数のサーバのメモリ上で分散して管理する
ミリ秒単位の高速応答処理が可能

* アーキテクチャ

データをメモリ上に置くことで、高速なデータアクセスが実現
データを多数のサーバで分散して管理

* 利用データ

金融の取引処理データでミリ秒以下の応答時間を実現

| オンプレ | AWSサービス |
|:--|:--|
| GEODE,ORACLE,hazelcast,Ignite,Infinispon | Redis ElastiCache, Memcached ElastiChache |

## 全検索型エンジン×分散型DB

* 概要

全検索型のデータ検索エンジンで、分散データベースと連携して検索データベースを構築
検索条件との関係性・関連性が高いデータを抽出して返す

* アーキテクチャ

Elasticsearchは前文検索用のライブラリ。Apach Luceneを利用したデータストア
分析の柔軟性や速度が高く、分析、蓄積・可視化環境を容易に構築可能

* 利用データ

半構造化データ（XML/JSON）
高可用な全検索エンジン
サイト内でデータの検索
デバイス登録状況・配信状況のリアルタイム可視化などリアルタイム検索要件/検索行動の可視化

| オンプレ | AWSサービス |
|:--|:--|
| elasticsearch,kibana | Elasticsearch Service |

## グラフDB

* 概要

グラフ演算に特化したDBでデータ間の繋がり方を検索・可視化に利用

* アーキテクチャ

グラフデータ構造を取るため、RDB以上にスケールアウトができない
レコード数が増えると、検索にかかる時間と難易度が増大
ACID特性が担保されていおり、オブジェクト間の関連付けを簡単に表現できる

* 利用データ

最短経路探索
金融取引の詐欺検出
ソーシャルネットワークによるリレーション計算

| オンプレ | AWSサービス |
|:--|:--|
| neo4j | Amazon Neptune |

## 分散OLTP

* 概要

グローバルに分散され、強制合成を揃えたデータベース

* アーキテクチャ

リレーショナルデータベースの構造と非リレーショナルデータベーるの分散スケーラビリティを兼ね揃える
高い可用性、高性能のトランザクションと強制合成が実現

* 利用データ

大規模な業務データ処理

| オンプレ | AWSサービス |
|:--|:--|
|  | Amazon aurora |

## まとめ

データ構造がシンプルで利用しやすい場合はNoSQLのKVS、ワイドカラム、ドキュメントDBを利用し、
複雑なDB処理が必要な場合はRDBやグラフDBを利用する。
検索に特化したい場合はElasticSearch
DWHとして利用したい場合はRedshift
データレイクとして利用する場合はS3