AWS Solutions Architect · レッスン

テーブル、アイテム、プライマリキー

パーティションキーと複合プライマリキーを使って DynamoDB テーブルを設計し、アイテム単位のストレージ制限を理解します。

レッスン 1/413 ステップ

「テーブル、アイテム、プライマリキー」はCoddyKit上の無料AWS Solutions Architectレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAWS Solutions Architect学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AWS Solutions Architectコースには全4レッスンが含まれています。

DynamoDB:NoSQL キーバリューストア

Amazon DynamoDBは、あらゆる規模で 1 桁ミリ秒のパフォーマンスを実現するよう設計された、フルマネージド型のサーバーレスキーバリューおよびドキュメントデータベースです。リレーショナルデータベースとは異なり、DynamoDB はスキーマレスです。プライマリキーが存在していれば、各アイテムは異なる属性セットを持つことができます。

DynamoDB はテーブルにデータを保存します。テーブルは SQL のテーブルに相当する最上位のコンテナです。テーブルは複数の AZ にまたがる複数のストレージノードに自動的に分散されるため、利用者による設定なしで組み込みの冗長性が提供されます。

テーブルとアイテム

DynamoDB のテーブルにはアイテムの集合が格納され、各アイテムは属性の集合です。属性は型付きの値であり、String (S)、Number (N)、Binary (B)、Boolean (BOOL)、Null (NULL)、List (L)、Map (M)、Set 型(SS、NS、BS)があります。

テーブル内のすべてのアイテムにはプライマリキー属性を含める必要があります。その他の属性はすべて任意であり、アイテムごとに異なっていてもかまいません。1 つのアイテムのサイズは、すべての属性名と値を含めて最大 400 KB です。

# Example DynamoDB item structure (JSON)
{
  'UserId': {'S': 'user-abc-123'},
  'Timestamp': {'N': '1719000000'},
  'Username': {'S': 'alice'},
  'Score': {'N': '4200'},
  'Tags': {'SS': ['premium', 'verified']}
}

シンプルプライマリキー:パーティションキーのみ

シンプルプライマリキーは、パーティションキー(ハッシュキーとも呼ばれます)という 1 つの属性で構成されます。DynamoDB はパーティションキーの値に内部ハッシュ関数を適用し、そのアイテムを保持するストレージパーティションを決定します。同じパーティションキー値を持つすべてのアイテムは、まとめて保存されます。

シンプルプライマリキーでは、テーブル内の 2 つのアイテムが同じパーティションキー値を持つことはできません。パーティションキー値が各アイテムを一意に識別するためです。この設計は、ユーザー ID や注文 ID など、常に一意の識別子でデータにアクセスするテーブルに適しています。

# Create a table with a simple (partition key only) primary key
aws dynamodb create-table \
  --table-name Users \
  --attribute-definitions AttributeName=UserId,AttributeType=S \
  --key-schema AttributeName=UserId,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST

複合プライマリキー:パーティションキーとソートキー

複合プライマリキーは、パーティションキーとソートキー(レンジキーとも呼ばれます)の両方を使用します。同じパーティションキーを持つアイテムはまとめて保存され、ソートキーの値で並べ替えられるため、パーティション内で範囲クエリを実行できます。

この設計は非常に柔軟です。ソートキーが異なっていれば、複数のアイテムが同じパーティションキーを共有できます。たとえば、Orders テーブルでパーティションキーに CustomerId、ソートキーに OrderDate を使用すると、顧客ごとのすべての注文を日付順にクエリできます。

# Create a table with a composite primary key
aws dynamodb create-table \
  --table-name Orders \
  --attribute-definitions \
    AttributeName=CustomerId,AttributeType=S \
    AttributeName=OrderDate,AttributeType=S \
  --key-schema \
    AttributeName=CustomerId,KeyType=HASH \
    AttributeName=OrderDate,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

パーティションキーの設計とホットパーティション

適切なパーティションキーの選択は、DynamoDB の設計で最も重要な判断です。適切なパーティションキーはカーディナリティ(異なる値の数)が高く、アクセスをパーティション間に均等に分散します。選択を誤ると、1 つのパーティションにトラフィックが偏るホットパーティションが発生し、スロットリングの原因になります。

避けるべきアンチパターンには、ブール値フラグ(値が 2 つしかない)、当日の書き込みをすべて同じグループにまとめる日付、カーディナリティの低いステータスフィールドがあります。適切な選択肢は、ユーザー ID、デバイス ID、ランダムな UUID、または tenantId#entityType のような複合値です。

PutItem、GetItem、DeleteItem

DynamoDB の基本的なアイテム操作は次の 3 つです。

  • PutItem:新しいアイテムを書き込むか、同じプライマリキーを持つ既存のアイテムを完全に置き換えます
  • GetItem:完全一致するプライマリキーで 1 つのアイテムを取得します(完全なキー、つまりパーティションキーと、複合キーの場合はソートキーが必要です)
  • DeleteItem:完全一致するプライマリキーでアイテムを削除します

これら 3 つの操作はすべて、アイテム単位でアトミックです。デフォルトでは、GetItem は結果整合性のある読み込みを使用します。--consistent-read を追加すると、最新の書き込み値を常に返す強力な整合性のある読み込みが強制されます。

# PutItem
aws dynamodb put-item \
  --table-name Users \
  --item '{"UserId":{"S":"user-123"},"Name":{"S":"Alice"}}'

# GetItem
aws dynamodb get-item \
  --table-name Users \
  --key '{"UserId":{"S":"user-123"}}' \
  --consistent-read

UpdateItem と条件式

UpdateItemは、PutItem とは異なり、既存のアイテム全体を置き換えずに特定の属性を変更します。属性の追加や削除、Number 属性に対する算術演算(カウンターのインクリメントなど)をアトミックに実行できます。

条件式を使用すると、条件が真の場合にのみ操作を成功させるよう指定できます。たとえば、アイテムのステータスが現在 PENDING の場合にのみ更新できます。これはトランザクションを使わずに楽観的ロックのパターンを実装するもので、DynamoDB の重要な設計手法です。

# Atomically increment a counter, only if item exists
aws dynamodb update-item \
  --table-name Orders \
  --key '{"CustomerId":{"S":"c-123"},"OrderDate":{"S":"2026-06-20"}}' \
  --update-expression 'SET ItemCount = ItemCount + :inc' \
  --condition-expression 'attribute_exists(CustomerId)' \
  --expression-attribute-values '{":inc":{"N":"1"}}'

Query と Scan の比較

Queryは、同じパーティションキー値を共有するアイテムを取得し、必要に応じてソートキーの条件で絞り込みます。対象のパーティションだけを読み取るため、Query は効率的です。begins_with、between、=、<、> などのソートキー条件を使用して、パーティション内の結果を絞り込めます。

Scanはテーブル内のすべてのアイテムを読み取り、その後、任意のフィルター式を適用します。大規模なテーブルでは Scan にコストがかかるため、本番環境のクエリパターンでは避けるべきです。頻繁に Scan が必要になる場合は、テーブル設計を見直すか、グローバルセカンダリインデックスを追加してください。

# Query: get all orders for customer c-123 after a date
aws dynamodb query \
  --table-name Orders \
  --key-condition-expression 'CustomerId = :cid AND OrderDate >= :dt' \
  --expression-attribute-values \
    '{":cid":{"S":"c-123"},":dt":{"S":"2026-01-01"}}'

強い整合性読み取りと結果整合性読み取り

DynamoDBは、複数のAZにデータを3つコピーして保存します。結果整合性読み取り(デフォルト)では、直近の書き込みがまだすべてのコピーに反映されていない場合、わずかに古い値が返されることがあります。ただし、消費する読み取りキャパシティユニットは、強い整合性読み取りの半分です。

強い整合性読み取りでは、常に最新のコミット済み書き込みが返されますが、RCUは2倍必要で、Global Secondary Indexでは利用できません。高スループットの読み取り中心のワークロードでは結果整合性読み取りを選択し、アプリケーションで絶対に最新のデータが必要な場合に限り、強い整合性読み取りを使用してください。

DynamoDBトランザクション

DynamoDBは、ACIDトランザクションをTransactWriteItemsとTransactGetItemsでサポートしています。1つのトランザクションには、複数のアイテム、さらには複数のテーブルにまたがる最大100個の書き込み操作をまとめることができ、すべて成功するか、すべてがアトミックにロールバックされることを保証します。

トランザクションは、口座間の送金(1つのアイテムから引き落とし、別のアイテムに入金)や座席の予約(空き状況の確認と予約をアトミックに実行)などのシナリオで使用します。トランザクションは通常のRCU/WCUの2倍のコストがかかるため、複数のアイテム間で本当にアトミック性が必要な場合にのみ使用してください。

アイテムサイズの制限とデータモデリングのヒント

DynamoDBの1アイテムあたり400 KBという制限は、データモデリングに影響します。大きなペイロード(画像や大きなドキュメントなど)は、バイナリデータをS3に保存し、DynamoDBにはS3オブジェクトキーだけを保存してください。深くネストされた階層データの場合は、シングルテーブル設計を使用し、各ノードタイプを独自のパーティションキーパターンでモデル化します。1つのテーブルに複数のエンティティタイプを格納し、パーティションキーのプレフィックスとソートキーパターンで区別します。

シングルテーブル設計はテーブル数を最小限に抑え、関連するアイテムを同じパーティションに配置することで、効率的なアクセスパターンを実現します。これは高度な手法であり、運用上のオーバーヘッドを削減し、複雑なアクセスパターンに対するパフォーマンスを向上させます。

クイックチェック

このレッスンで扱ったAWS Solutions Architect(SAA-C03)の概念について、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、DynamoDBのテーブルにはスキーマレスのアイテムが格納され、サイズは400 KBに制限されること、単純なプライマリキーはパーティションキーだけで構成され、複合キーでは範囲検索のためにソートキーが追加されること、そしてカーディナリティの高いパーティションキーによってホットパーティションを防げることを学びました。効率的にアクセスするには、ScanではなくQueryを使用してください。次は、プロビジョンドとオンデマンドのキャパシティモードについて説明します。

無料で開始

AI チューターと学ぶ AWS Solutions Architect — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
30
レッスン
120

よくある質問

「テーブル、アイテム、プライマリキー」レッスンは無料ですか?

はい。「テーブル、アイテム、プライマリキー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AWS Solutions Architectコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AWS Solutions Architectコースには全4レッスンが含まれています。

「テーブル、アイテム、プライマリキー」で何を学びますか?

パーティションキーと複合プライマリキーを使って DynamoDB テーブルを設計し、アイテム単位のストレージ制限を理解します。 ブラウザで直接実行するハンズオンコードでAWS Solutions Architectを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

AWS Solutions Architectを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAWS Solutions Architectは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「テーブル、アイテム、プライマリキー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAWS Solutions Architectレッスンでコードを書いて実行できますか?

はい。すべてのAWS Solutions Architectレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. テーブル、アイテム、プライマリキー
  2. プロビジョンドキャパシティとオンデマンドキャパシティ
  3. グローバルセカンダリインデックスとローカルセカンダリインデックス
  4. DynamoDB Streams とグローバルテーブル
← AWS Solutions Architectに戻る