ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス
DynamoDB は AWS が提供するフルマネージドの NoSQL データベースサービスです。Key-Value ストアとドキュメントストアの両方の特性を持ち、サーバーのプロビジョニングやパッチ適用を一切気にせずに使えます。
RDB(MySQL 等)は Excel のような表形式です。すべての行が同じ列を持ち、列の追加には ALTER TABLE が必要 ── つまり「型が先にあってデータが後から入る」イメージです。
一方 DynamoDB は JSON のような自由な構造です。アイテム(行に相当)ごとに属性(列に相当)が違っても OK。定義が必要なのは主キーだけで、それ以外はアイテムごとに好きな属性を付けられます。
| 項目 | RDB | DynamoDB |
|---|---|---|
| データモデル | テーブル / 行 / 列 | テーブル / アイテム / 属性 |
| スキーマ | 固定(事前定義必須) | スキーマレス(主キーのみ定義) |
| クエリ言語 | SQL | API(GetItem, Query, Scan) |
| JOIN | 可能 | 不可(単一テーブル設計) |
| トランザクション | ACID(標準) | TransactWriteItems(最大100アイテム) |
| スケーリング | 垂直(インスタンスサイズ変更) | 水平(パーティション自動分散) |
| 料金モデル | インスタンス時間課金 | RCU/WCU or オンデマンド |
| 最大アイテムサイズ | 行サイズ制限は DB 依存 | 400KB |
複雑な JOIN や集計クエリが多い、厳密な ACID トランザクションが必要、データの関係性が複雑なアプリケーション(会計システム、ERP など)。
大量の読み書きを低レイテンシで処理したい、アクセスパターンが明確、スケーラビリティ最優先(ゲーム、IoT、セッション管理など)。
DynamoDB のデータは テーブル → アイテム → 属性 の3層構造です。RDB の「テーブル → 行 → 列」に似ていますが、大きな違いがあります。
RDB ではテーブル作成時にすべてのカラムを定義しますが、DynamoDB で定義するのはテーブル名と主キーだけです。それ以外の属性はアイテムごとに自由に追加でき、アイテムによって属性が異なっても問題ありません。
データの入れ物。作成時に定義するのはテーブル名と主キー(KeySchema)だけ。RDB のように全カラムを事前定義する必要はありません。キャパシティモード(オンデマンド / プロビジョンド)もここで指定します。
主キーで一意に特定される1件のデータ。最大サイズは 400 KB。最大の特徴はアイテムごとに属性が異なって OK という点です。上の図のように Item 1 に「Status」があり Item 2 にはなくても問題ありません。
各属性は名前 + 値 + 型のセットです。RDB では値が空でも NULL 列として存在しますが、DynamoDB では値を省略すれば属性自体が存在しません。これにより不要なデータを保存しなくて済みます。
同じ Partition Key に対して範囲クエリが使えます。between、begins_with、>= などの条件で効率的にフィルタできます。
{
"TableName": "Orders",
"KeySchema": [
{ "AttributeName": "UserId", "KeyType": "HASH" },
{ "AttributeName": "OrderDate", "KeyType": "RANGE" }
]
}
// Query: UserId="u-001" AND OrderDate BETWEEN "2024-01" AND "2024-06"
// → u-001 の 2024年上半期の注文だけ取得DynamoDB の属性には型(Type)があります。RDB ではカラム定義時に型を決めますが、DynamoDB では属性の値を書き込むときに型を指定します。
API やJSON形式で値を指定する際、型コード(S, N, BOOL など)をキーにして値を渡します。例えば文字列なら {"S": "hello"}、数値なら {"N": "42"} のように書きます。
{
"UserId": { "S": "u-001" },
"Age": { "N": "25" },
"IsActive": { "BOOL": true },
"Tags": { "SS": ["premium", "jp"] },
"Profile": { "M": {
"Name": { "S": "田中太郎" },
"Score": { "N": "980" }
}}
}S文字列(String){"S": "hello"}主キーに使えるN数値(Number){"N": "42"}主キーに使える。値は文字列で渡すBバイナリ(Binary){"B": "dGVzdA=="}Base64エンコード。画像ハッシュ等BOOL真偽値(Boolean){"BOOL": true}NULLNull{"NULL": true}値が存在しないことを明示Lリスト(List){"L": [{"S":"a"}, {"N":"1"}]}異なる型を混在可能Mマップ(Map){"M": {"Name": {"S":"太郎"}}}JSONオブジェクトのような入れ子SS文字列セット{"SS": ["red","blue"]}NS数値セット{"NS": ["1","2","3"]}BSバイナリセット{"BS": ["dGVzdA=="]}DynamoDB の「スキーマレス」とは、テーブル作成時に主キー以外の属性を定義する必要がないということです。各アイテムが異なる属性を持てるため、アプリケーションの進化に柔軟に対応できます。

ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス

ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス

ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス

ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス

ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス

ミリ秒レベルのレイテンシを実現するフルマネージドNoSQLデータベースサービス