[DB] 様々なDBのユースケースを考えてみた
社内で行われる週1のエンジニアのチーム活動の中で、DBのユースケースについて考える機会があり、私自身これまでどのDBが最適なのかを深く意識したことがなかったので、なるべく情報を集約し、記事としてまとめてみました。
DB選択はシステム要件に依存するため、「こんなケースだったらこのDBを検討した方が良さそうだよね」と言った観点で書いていきます。
以下のサイトを参考にさせていただきました。 (GPTさんにもお世話に)
では、初めていきます。
RDBMSとNoSQLとは?
-
RDBMS
データを複数の表として管理し、表と表の関係を定義することで、複雑なデータの関連性を扱えるようにしたデータベース管理方式 -
NoSQL
「Not Only SQL」の略でRDBMS以外のデータベース管理方式のことで、様々な形式でのデータ格納が可能
様々な形式とは?
RDBMSとNoSQLの違い
- データモデル
- 「RDBとNoSQLとは?」の通り(重複してしまってすいません)
- スキーマ
- RDBMS
- 事前に定義されたスキーマに従う必要がある(固定)
- NoSQL
- 事前に定義する必要がないためスキーマを柔軟に扱える(柔軟・または無し)
- RDBMS
- トランザクション
- RDBMS
- ACID(原子性、一貫性、独立性、永続性)トランザクションをサポートすることが一般的
- NoSQL
- 柔軟性・スケーラビリティを優先のため、トランザクションの一部のみサポートしている
- グラフ型は例外
- 柔軟性・スケーラビリティを優先のため、トランザクションの一部のみサポートしている
- RDBMS
- スケーラビリティ
- RDBMS
- 垂直スケーリングにより性能UP
- 厳格なスキーマにより、読み取り/書き込みレプリカワークロードの水平スケーリングには、パーティショニングやシャーディングなどの特別な戦略が必要となる
- NoSQL
- 水平スケーリングにより性能UP
- 自動シャーディング(データが自動的に複数のサーバーに分割され、各サーバーが自身のデータセグメントを処理)が行われ、スキーマ自体がRDBMSより柔軟なため、変更や追加にも容易に対応が可能
- RDBMS
RDBMSとNoSQLどちらを選択するべきかを見極めるポイント
これまでの内容を踏まえ、以下を押さえておくと良いのではと思います。
- データの構造と要件を評価し、複雑なデータを厳格に扱う必要がある場合はRDBMS、大規模なデータセットを柔軟性に扱う必要がある場合はNoSQLデータベースを検討
- アプリケーションの将来性を考慮する場合は、スケーラビリティを考え、どのようにスケーリングさせる必要があるかを検討
- 複雑なトランザクション処理やデータ整合性担保する場合はRDBMSだが、柔軟性・スケーラビリティが重視される場合はNoSQLを検討
- アプリケーション内で扱うデータの一貫性と可用性を評価し、一貫性が最も重要で、可用性はある程度考慮すれば良い場合はRDBMSだが、可用性を最も重要とする場合はNoSQLを検討
RDBMS製品のデータベース種類と特徴
では、もう少し掘り下げ、RDBMS製品に絞ってみてみましょう。
大きく5つあります。
- Oracle Database
- 比較的大規模なシステムに向いた、Oracle社が販売する商用RDBMS(商用ライセンス)
- 様々なプラットフォームに対応しており、Oracle社からのサポートがある(サポート契約)
- インデックスやクエリの最適化機能により、高速なデータ検索とクエリ処理を提供
- 高度なキャッシングやストレージ最適化機能により、パフォーマンスを最大化
- Microsoft SQL Server
- 中〜大規模システム・BIアプリ向きのMicrosoft社が販売する商用RDBMS(商用ライセンス)
- Windows OSとの相性がよい
- In-Memory OLTPなどの高速処理機能があり、高負荷のトランザクション処理にも対応
- MySQL
- 中規模アプリ・組み込みアプリ・特にWEBアプリ等向きのオープンソースRDBMS(商用利用時は例外)※ オラクル社が開発
- 大規模に対応させる場合はクエリキャッシュ、テーブルキャッシュなどの機能により、高速なデータアクセスが可能
- 適切なストレージエンジン(InnoDB、MyISAMなど)を選択することでパフォーマンスを最適化
- PostgreSQL
- 大規模アプリ・複雑な処理を必要とするアプリ・組み込みアプリ・WEBアプリ・特にACID準拠及び大量データの管理に向いているオープンソースORDBMS
- インデックスやヒープスキャン、クエリプランナーの機能により、効率的なデータアクセスと処理が実現され無償で拡張機能を追加でき、高度なデータ型による構築や運用が可能
- SQLite
- IoT・組み込みアプリ・デスクトップアプリ・小規模WEBアプリ向きのサーバーレスなオープンソースRDBMS
データ型を指定することなく、データベースファイルの扱いが簡単にでき、軽量なトランザクション管理を行なっているため、小規模に限り高度なパフォーマンスを他のRDBMSより比較的低コストで実現可能
- IoT・組み込みアプリ・デスクトップアプリ・小規模WEBアプリ向きのサーバーレスなオープンソースRDBMS
RDBMSの見極めポイント
RDBMSならとりあえずPostgreSQLでなんとかなりそうな気がしますが、しっかりと見極めポイントを把握した上で選択できるようになるために、以下の観点は必要だと思います。
特にPostgreSQLとMySQL
- Windowsサーバーで動作させたい場合は 「Microsoft SQL Server」を検討
- システムの規模と用途を把握し、大規模なWEBアプリで割と複雑なケースの場合は、「Postgresql」を検討し、WEBアプリでさほど規模は大きくないが信頼性があり、軽量で処理速度が早いことを重要視するのであれば「MySQL」を検討
- コストをかけてでもサポートの充実性と保守性を第一に意識するのであれば、「Oracle Database」を検討
- 小規模でとりあえずコストをかけず使用してみたいと考えるのであれば「SQLite」を検討
NoSQL製品のデータベース種類と特徴
NoSQLも見ておきましょう。
- DynamoDB
- 小規模から大規模なWEBアプリ・リアルタイムデータ処理に向いたキーバリュー型のNoSQL
- 自動シャーディングやマネージドサービスを備えており、高い可用性と耐久性を実現し、ミリ秒単位のレイテンシーを可能とし、スケーラブルでパフォーマンス性が高い
- Redis
- 小規模から中規模のWEBアプリケーションのキャッシュ・セッション管理に向いたキーバリュー型のNoSQL
- 高速な読み書きアクセスと低レイテンシーを実現し、メモリ上のデータを任意のタイミングでディスクに格納して保持する仕組みによりデータの永続が可能で、レプリケーション機能も搭載(大容量には不向き)
- MongoDB
- 中規模のWEBアプリ・不特定多数のデータ形式を必要とする場合に向いたドキュメント指向型のNoSQL
- JSON形式のドキュメントを格納可能で、高速なデータベース読み書き操作を提供し、外部システムとの連携も容易に行え、拡張性や冗長性にも優れている
- Redshift
- データ量が膨大(数テラバイトから数ペタバイト規模)で高い書き込み処理が必要な場合に向いたカラム指向型のNoSQL
- 列指向のアーキテクチャと分散処理により、集計、フィルタリング、結合などのクエリが大規模なデータセットに対して効率的に実行でき、クラウド環境動作のためスケーラビリティと柔軟性が担保される
- Neptune
- 行動パターン分析・ネットワーク関係及び構造分析等の関係性の分析に向いたグラフ指向型のNoSQL
- GremlinとSPARQLという2つの標準的なグラフクエリ言語をサポートしており、柔軟なクエリ実行が可能であり、マネージドサービスのためデータベース運用に重点を置く必要がなく、小さなデータを大量に正確に処理(1処理でデータの一部を検索)が効率的に行われる
NoSQLの見極めポイント
- システムの用途を考慮し、WEBアプリやリアルタイムデータストリーミングなら「DynamoDB」「MongoDB」、キャッシュやセッション管理なら「Redis」、リアルタイムデータのレポーティングやデータの関係性を分析するなら「Redshift」「Neptune」を検討
- 上記紹介した以外のNoSQL製品を検討する場合は、システムで扱うデータとデータモデル(カラム指向・ドキュメント指向など)との適合性を評価し、DB取扱企業のサポート体制を評価した上で、同じデータモデルを採用しているDB同士のパフォーマンスとレイテンシーを比較検討すると良い
まとめ
DB選択は、誤ると後の開発に大きく響くとても重要なタスクのため、
記事にまとめた内容は最低限考慮する必要があると感じました。
特に、「今の要件だったらこのDBかな」という選択はできても、「将来的にはこうなるだろうからこのDBかな」といった、システムの将来性を見込んだ選択はシステムの拡張性に大きく影響し、DBの弊害でやりたいことができないといった事象が起きない選択ができたらベストだと感じました。
また、開発チームのスキルや知識に合わせてデータベースを検討することも視野に入れるとなお良いと思いました。
今回の記事が誰かのお役に立てれば幸いです。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion