はじめに
私のような令和プログラマー*1にとって、圧倒的に不足しがちなのがDB・ネットワーク等のインフラ周りの知識・経験です。
(*1: 令和になってからプログラミングを知った人。初心者のこと。)
しかしながら、AWSやFirebase等のマネージドサービスを活用することで、これまでよりも簡単に、セキュリティ・可用性の高い堅牢なインフラ運用を体験することができるようになっています。
今回は『AWS Japan Summit Online 2020』のオンラインセッションで学んだ
データベース基礎 [ Purpose Build ] の考え方をまとめます。
様々なデータベース
私のような初心者にとって『データベース = リレーショナルデータベース』でした。
しかし現代には様々なデータベースが存在し、実際にAWSでは以下の種類のDBサービスを提供しています。
- Relational
- Key-Value
- Document
- In-Memory
- Graph
- Time-Series
- Ledger
要件に合わせた最適なDBを選択する必要があります。すなわち[ Purpose Build ] です。
Relational
リレーショナルデータベースは多くの人に馴染みのあるDBかと思います。
以下のような特徴があります。
- 複数ユーザーからのクエリに対する一貫性
- テーブル同士の関係性
- 柔軟なクエリ
管理しやすく、テーブルの追加や変更が比較的柔軟に行えるため、様々な用途で使われています。
AWSサービスの例
- RDS
- Aurora
NoSQL
Relationalデータベース以外を、広くNoSQLデータベースと言います。
「Not Only SQL」の略語で、Relationalデータベースの課題を解決するために生まれました。
Relationalと比較して、以下のような特徴があります.
- シンプルなデータ構造
- 非正規化
- DBによって異なるクエリ方法
- 限定的なトランザクション
- 高いスケーラビリティ
Key-Value
{ key: Value }
のシンプルな構造故、高スループット・低レイテンシが特徴です。
トラフィックの多いWebサービスやゲームなどに向いています。
AWSサービスの例
- DynamoDB
- Keyspaces(Cassandra)
Document
JSONやXMLなどドキュメントと格納し、クエリに応じて任意のデータを取り出します。
コンテンツ管理、ユーザープロファイルなどに向いています。
JSONをリレーショナルDBのスキーマにマッピングする必要がないため高速・高可用性を実現できます。
AWSサービスの例
- DocumentDB
In-Memory
キャッシュを利用してマイクロ秒のレイテンシでクエリします。
キャッシュ・セッション管理・地理空間アプリケーションに向いています。
AWSサービスの例
- ElastiCache
Graph
データ間を相互に結びつけ、関係性をグラフで表します。
リレーショナルデータベースでは、関係性が複雑になると対応してクエリも複雑になります。
Graphでは初めから関係性への対応に最適化されているので、クエリをシンプルに保ち、高速です。
ソーシャルネットワーク・レコメンデーションエンジンなどに向いています。
AWSサービスの例
- Neptune
Time-Series
特定の間隔で記録され続ける時間の経過にともなう変化を測定します。
時系列のデータ分析・ログに向いています。
ログのデータは大量に発生し、常にデータが挿入され続けるため、こちらもリレーショナルデータベースでの対応が難しい分野です。
AWSサービスの例
- Timestream
Ledger
データの変更履歴がイミュータブル(変更不可)という特徴があります。
ハッシュ関数を利用し、変更されていないことを検証することができます。
改竄・変更の保証をすることが可能です。
銀行のトランザクションや記録システムなどに向いています。
AWSサービスの例
- Quantum Ledger Database
まとめ
様々な用途・要件に合わせて最適化されたDBを使用することで高いパフォーマンス・可用性・コスト効率を実現することができます。
適材適所の選択をする [ Purpose Build ] が必要であり、そのためには様々なサービスに触れて知識として持っておくことが重要かと思います。