こんにちは。Tomoyuki(@tomoyuki65)です。
Webサービスを開発する際は、何らかのデータベース(Database/DB)を使ってデータの保存や更新などをする必要がありますが、そんなDBには様々な種類があり、作るものによって使い分けも必要です。
この記事では、そんなデータベース(Database/DB)の種類と使い分けについてまとめます。
データベース(Database/DB)の種類と使い分けについて
主なデータベース(Database/DB)の種類や特徴は以下の通りです。
| カテゴリ | 分類 | 主なサービス名 | 特徴 | 強み | 弱み | 主な用途 |
|---|---|---|---|---|---|---|
| リレーショナルDB | RDB | MySQL PostgreSQL Oracle |
テーブル構造 + SQLによるデータ管理 | ・高い整合性 ・成熟した技術 |
・単一サーバー前提であり、水平スケール(サーバーを増やす)が難しい ・大量データを扱うのは苦手(特に書き込み処理) |
・業務システム ・会計/決済 |
| 分散リレーショナルDB | NewSQL | Google Spanner TiDB(MySQL互換) YugabyteDB(PostgreSQL互換) |
ACID特性(整合性)を維持した分散DB | ・水平スケール可能 ・高可用性 |
・設計・運用が複雑 ・コストが高い |
・大規模Webサービス ・金融・決済システム ・ゲーム ・グローバルサービス |
| 非リレーショナルDB | NoSQL | Google Cloud Firestore AWS DynamoDB MongoDB |
スキーマレスな分散DB | ・柔軟な構造 ・高スケーラビリティ |
・JOIN不可/弱い ・整合性に注意 |
・リアルタイム分析系 ・SNSやメッセージング系 ・柔軟なデータ管理 |
| インメモリDB/キャッシュ | キー・バリュー型 | Redis | メモリ常駐の高速Key-Value | ・非常に高速 ・実装が簡単 |
・メモリ依存 ・永続用途に不向き |
・キャッシュ ・セッション管理 |
| 検索・分析エンジン | 分散全文検索 | OpenSearch Elasticsearch |
全文検索・分析特化エンジン | ・高速検索 ・柔軟な検索条件 |
・更新が重い ・正規DB不可 |
・ログ検索 ・全文検索 |
※RDBについては、AWSならRDS(または高可用性のAurora)、GoogleならCloud SQLが該当のサービスになります。性能的には「Aurora > RDS ≒ Cloud SQL」のような感じです。Google Cloudの方でのより高性能なDBはNewSQLのSpannerとなります。
RDBとNoSQLはどっちを使えばいい?
データの整合性(データがおかしな状態にならないようにルールを守ること)を重視する場合は RDB を使います。
そのため、一般的なWebサービスで重要なデータ(顧客情報、契約情報、在庫情報、お金など)を扱う部分は、基本的にRDBを使うことが多いです。
一方で、データ形式が変化しやすかったり、高速で柔軟な読み書きが必要になる場合はNoSQLをの利用を検討します。
例えばリアルタイム性が高いチャットアプリのメッセージ保存などでは、NoSQLの方が最適です。
NewSQLはどんな時に使うべき?
NewSQLについては、RDBと同様にデータの整合性を重視しつつ、大量のデータやアクセスを分散して高速に処理できるデータベースです。
そのため、従来のRDBでは処理が追いつかないような大規模Webサービスや、金融・決済システム、そしてグローバル展開するようなサービスなどで使われます。
ただし、高性能な分コストも高くなるため、導入するかどうかは慎重に判断する必要があります。
MySQLとPostgreSQLはどっちを使えばいい?
MySQLは手軽さや速度、そしてWeb用途を重視したデータベースであり、シンプルなCRUD中心のアプリやCMS(WordPressなど)に向いています。
一方、PostgreSQLは正確さや一貫性、そして拡張性を重視したデータベースであり、SQL標準に忠実で、複雑なクエリ(問い合わせ)やトランザクション(一連のまとまった処理)、将来の仕様変更に強い(最初から厳密・標準準拠・拡張前提で作られている)のが特徴です。
そのため、これから新規開発する場合や、業務システムなどの場合、そして将来要件が増えそうな場合においては、PostgreSQLを使うのが最適です。
RDBとしてSQLiteは使わないの?
SQLiteは軽量で組み込み向けのリレーショナルデータベースで、MySQLやPostgreSQLのようなサーバーを必要とせず、一つのファイルとして動作するのが最大の特徴です。
デスクトップアプリやスマートフォンアプリ、Webブラウザ内部などでは広く利用されていますが、同時アクセスやスケーラビリティの制約があるため、一般的なWebアプリケーションのDBとして採用されることはほとんどありません。
Redisはどんな時に使うべき?
Redisについては、メモリ上にデータを置いて高速に読み書きできるデータベースで、頻繁にアクセスされるデータや一時的に保持するデータを扱う場面に向いています。
データはキーと値(Key-Value) の形式で管理されるため、単純な読み書き操作が非常に高速に行えます。
主にキャッシュや、ログインセッション管理などに使われることが多く、データの永続保存には向いていません。
OpenSearch(Elasticsearch)はどんな時に使うべき?
OpenSearch(Elasticsearchのフォーク)については、大量のデータを高速に検索・分析するためのデータベースで、全文検索、ログの検索・集計、イベントデータの分析などに向いています。
ユーザーが検索するようなデータがある場合、RDBとは別に検索用データをOpenSearchに登録しておくことで、検索処理を効率的に行うことができます。
ただし、元のRDBなどのデータとの整合性を保つためには、データの同期方法や更新のタイミングを工夫して設計する必要があります。
DBとストレージサービスとの違いについて
データの保存に関しては、上記で説明したDBの他にもストレージサービス(AWS S3、Google Cloud Storageなど)があります。
ストレージサービスは、データを安全に保管することを目的としており、非構造的なデータ(PDFファイルなど)や大容量データ(写真、動画など)の保存に向いています。
ただし、データベースのように検索や集計、更新などの操作は基本的にできないため、一般的なデータ管理には向きません。
最後に
今回はデータベース(Database/DB)の種類と使い分けについてまとめました。
Webサービスの開発においては、まずはリレーショナルDB(MySQLやPostgreSQLなど)を使うのが基本になりますが、必要に応じてNoSQL、Redis、OpenSearch(Elasticsearch)も使ったりします。
DBの種類に応じて向き不向きがあるため、それらの使い分けについては理解しておくようにしましょう。



コメント