AWS DynamoDBについて理解を深める

# DynamoDBとは
Amazon Web Services（AWS）が提供するフルマネージドのNoSQLデータベースサービスです。自動スケーリングと高可用性を提供し、パフォーマンスを維持しながら大規模なアプリケーションに対応できるよう設計されています。DynamoDBのアーキテクチャは手動でのパーティショニングやスケーリングの必要がなく、開発者にとってシームレスなエクスペリエンスを提供します。


<img width="79%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690843/453bd885-427c-0651-eb76-1fa47fc07713.png">



## DynamoDBの動作
#### 1. リクエストの流れ
リクエストルーター: アプリケーションからのリクエストはまずリクエストルーターに到達します。
認証: ルーターがリクエストを認証します。
Auto Admin: DynamoDBはパーティションとメンテナンスを自動的に管理し、スケーラビリティとパフォーマンスを保証します。
データ書き込み: データはストレージノードに書き込まれ、B-treeに保存されます。各書き込みはレプリケーションログに記録されます。
ログ伝播: レプリケーションログの内容がセカンダリインデックスに反映され、効率的なデータ検索を可能にします。
#### 2. 自動スケーリングとパーティショニング
DynamoDBは大規模なデータセットを処理するためにデータを自動的に複数のノードにパーティショニングします。これにより、データ量に関係なく高可用性とパフォーマンスが維持されます。オートスケーリング機能により、データベースへのトラフィックに応じて読み書きのキャパシティが調整され、コストとパフォーマンスが最適化されます。

# DynamoDBとRDBMSの比較：主な制約
DynamoDBには従来のリレーショナルデータベース（RDBMS）に対する多くの利点がありますが、いくつかの制約も存在します。

#### テーブル間の結合ができない

理由: データがパーティションに分散されているため、RDBMSのようにテーブル間の結合が困難です。
対処方法: データの集約はアプリケーション側で行う必要があります。
#### 外部キーがない

理由: DynamoDBはフレキシブルなスキーマを持ち、キーはパーティションキーとソートキーに限定されます。外部キー制約は使用できません。
対処方法: 関係性はアプリケーションロジックで管理する必要があります。
#### 条件指定は基本的にプライマリキー以外は使用できない

理由: データが分散されているため、プライマリキー以外での検索には制約があります。
対処方法: プライマリキー以外の項目で検索する場合、セカンダリインデックスを作成する必要があります。
#### 副問い合わせができない

理由: データの分散性により、副問い合わせが実行できません。
対処方法: フィルタリングや集約はアプリケーション側で実行します。
#### GROUP BYなどの集約関数が存在しない

理由: DynamoDBはデータを分散して保存しているため、サーバーサイドでの集約処理がサポートされていません。
対処方法: アプリケーション内で集計処理を行います。
#### OR、NOTなどの論理演算子がなくANDのみ

理由: クエリは効率的なデータ検索を重視しており、複雑な条件指定（例: OR, NOT）はサポートされていません。
対処方法: クエリのフィルタなどで代替します。

# DynamoDBの特徴
1. データフィルタリング
フィルタを使用して、クエリやスキャンの結果を特定の条件に絞り込むことが可能です。
#### 2. TTL（Time to Live）
データの保存期間を設定し、自動的に期限切れのデータを削除する機能です。これにより、ストレージコストを削減し、データのクリーンアップを容易にします。
#### 3. DAX（DynamoDB Accelerator）
読み取り専用のインメモリキャッシュを提供し、読み取りパフォーマンスを大幅に向上させます。
#### 4. DynamoDB Streams
テーブル内のデータ変更（追加、更新、削除）をリアルタイムでキャプチャする機能です。これにより、変更を追跡したり、Lambda関数をトリガーするなどの応用が可能です。
#### 5. トリガー
DynamoDB Streamsを使用してLambda関数をトリガーし、テーブルのデータ変更に自動的に反応することができます。
#### 6. グローバルテーブル
複数のAWSリージョンにまたがるマルチリージョン、マルチマスターのデータベースを作成できます。これにより、世界中のユーザーに対して低レイテンシーでデータにアクセスできます。
#### DynamoDB Streamsの詳細
DynamoDB Streamsは、テーブルのリアルタイム変更をキャプチャするための強力な機能です。
#### ユースケース:
リアルタイム変更の検出
非同期データ処理
データの複製
# 書き込みオプション:
- [x] KEYS_ONLY: 変更された項目のキー属性のみを保存します。
- [x] NEW_IMAGE: 変更後の項目データ全体を保存します。
- [x] OLD_IMAGE: 変更前の項目データ全体を保存します。
- [x] NEW_AND_OLD_IMAGE: 変更前後の項目データ全体を保存し、項目の変更前後の状態を完全に比較できます。
# データ保持と暗号化:
ストリームデータは暗号化され、最大24時間保存されます。
#### ストリームの構成:
ストリームはシャードと呼ばれる単位で構成され、各シャードにストリームレコードが含まれます。各レコードにはDynamoDBテーブルでの変更内容が記録されます。


# DynamoDBの主なAPI操作
- [x] Scan: テーブル全体またはインデックスの項目を取得
- [x] PutItem: 項目を新規または更新して追加
- [x] UpdateItem: 項目の一部の属性を更新
- [x] DeleteItem: 項目を削除
- [x] BatchWriteItem: 一度に最大25個の項目を一括で追加または削除
- [x] TransactGetItems: 最大10個の項目を一度にトランザクションで取得
- [x] TransactWriteItems: 最大100個の書き込みアクションをトランザクションで一括実行
- [x] GetItem: プライマリキーを使用して単一の項目を取得
- [x] BatchGetItem: 最大100個の項目を一括で取得
Query: プライマリキーとソートキーに基づいて項目を検索

# まとめ
DynamoDBは、スケーラブルでフルマネージドなNoSQLデータベースで、リアルタイムデータ処理やグローバル展開などさまざまなユースケースに対応しています。従来のリレーショナルデータベースと比較していくつかの制約はありますが、スケーラビリティ、パフォーマンス、柔軟性の点で現代のアプリケーションにとって理想的な選択肢となり得ます。

DynamoDBのアーキテクチャ、機能、および制約を理解することで、その能力を最大限に活用し、アプリケーションのニーズに適応するデータモデルを設計・実装できます。


# 【参考】
https://aws.amazon.com/jp/dynamodb/