← ハンズオン一覧に戻る

AWS Hands-on / Database

1つのキーの下に、複数のデータを並べて持つ

DynamoDB テーブルに「パーティションキー」と「ソートキー」の複合キーを設定し、1人のユーザーに対する複数の注文履歴を保存します。Query 操作で「あるユーザーの注文だけ」を効率よく絞り込んで取得する体験をします。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 30〜50 分 コンソールのみで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須DynamoDB でテーブルを作成し、項目を出し入れした経験
  • あると良い「主キー」という言葉のイメージ

※ コマンドラインや SSH などの操作は一切ありません。すべてブラウザのコンソール上で完結します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

「あるユーザーの注文を全部見たい」というように、1つのキーに対して複数のデータがぶら下がる場面はよくあります。DynamoDB では、パーティションキー(グループを決めるキー)に加えて「ソートキー」(そのグループの中での並び順・絞り込みを決めるキー)を組み合わせた複合キーを使うことで、こうした構造を表現できます。

今回は、1人のユーザーが複数件の注文を持つというデータを実際に登録し、Query 操作を使って「あるユーザーの注文だけ」を効率よく取り出す体験をします。

ソートキーを使わずに、ユーザーIDだけをキーにしてもいいのでは?

パーティションキーだけだと、同じユーザーIDの項目は1件しか持てません(同じキーの項目は上書きされてしまいます)。1人のユーザーが複数件の注文を持てるようにするには、注文ごとに違う値になるソートキー(例:注文日時)が必要です。

Query と Scan は何が違うの?

Query はパーティションキー(と必要に応じてソートキーの条件)を指定して、該当する項目だけを効率よく取得します。Scan はテーブル全体を読み込んでから絞り込むため、テーブルが大きくなるほど時間も読み込み量(コスト)も増えます。特定のキーで絞り込めるときは Query を使うのが基本です。

Goal

パーティションキー+ソートキーの複合キーを持つテーブルを作り、1人のユーザーに対して複数件の注文データを登録したあと、Query 操作でそのユーザーの注文だけを取得できる状態にする。

04 — Architecture

つくる構成

テーブルのキー設計と、絞り込みに使う2つの操作の違いをイメージで確認しておきましょう。

テーブルを作成 — キーの設定(イメージ)

入力例

パーティションキーUserId(文字列)
ソートキーOrderDate(文字列)
今回使うのはこちら

Query

パーティションキーを指定して絞り込む。必要に応じてソートキーの条件も加えられる。該当する項目だけを効率よく読み込む。

比較対象

Scan

テーブル全体を読んでから絞り込む。テーブルが大きくなるほど時間も読み込み量も増えていく。

05 — Requirements

要件

以下の要件を満たし、複合キーを使った Query 操作の絞り込みを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2パーティションキー(例:UserId、文字列)とソートキー(例:OrderDate、文字列)を持つテーブルを1つ作成する(テーブル名は自由、例:Orders)。
3同じ UserId の値を持ち、OrderDate の値が異なる注文項目を3〜4件登録する(自由な属性、例:商品名、金額を添える)。別の UserId の項目も1〜2件登録する。
4「項目を探索」の Query 機能で、特定の UserId を指定し、そのユーザーの注文だけが取得できることを確認する。
5ソートキーの条件(例:「より大きい」「の間」などの比較演算子)を追加し、絞り込みがさらに効くことを確認する。
06 — Steps

構築の進め方

「複合キーのテーブルを作る → データを登録する → Query で絞り込む」という順番で進みます。

  1. マネジメントコンソールにサインインし、リージョンを東京に合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. DynamoDB コンソールで「テーブルを作成」を開き、パーティションキーとソートキーを設定する

    DynamoDB コンソールの「テーブルを作成」画面で、パーティションキーとソートキーをそれぞれ自由に決めます(例:UserId / OrderDate、両方とも文字列)。

    テーブルを作成 — キーの設定(イメージ)

    入力例

    パーティションキーUserId(文字列)
    ソートキーOrderDate(文字列)
    ソートキーは「追加項目」として設定する

    テーブル作成画面では、パーティションキーの入力欄の下に「並べ替えキーを追加」のような項目があります。ここでソートキーの名前と型を指定します。

  3. テーブル名を決めて作成する

    テーブル名を自由に決めて(例:Orders)、テーブルを作成します。作成が完了するまで少し待ちます。

  4. 「項目を作成」から、同じ UserId・異なる OrderDate を持つ項目を3〜4件登録する

    テーブルの「項目を探索」画面から「項目を作成」を選び、同じ UserId の値で、OrderDate の値だけを変えた項目を3〜4件作成します。商品名や金額など、自由な属性を追加してもかまいません。

  5. 比較用に、別の UserId を持つ項目も1〜2件登録する

    後で Query の絞り込み効果を確認しやすくするため、異なる UserId を持つ項目も1〜2件追加しておきます。

  6. 「項目を探索」のクエリ機能に切り替え、特定の UserId で実行する

    「項目を探索」画面の操作モードを「クエリ」に切り替え、パーティションキーの欄に手順4で使った特定の UserId の値を入力して実行します。そのユーザーの項目だけが返ってくることを確認しましょう。

    モードの切り替えを忘れずに

    「スキャン」モードのままだとテーブル全体が読み込まれてしまいます。クエリモードになっているかを確認してから実行しましょう。

  7. ソートキーの条件(比較演算子)を追加して再度実行する

    クエリの条件に、ソートキー(OrderDate)に対する比較演算子(例:「より大きい」「の間」など)を追加し、再度実行します。結果がさらに絞り込まれることを確認します。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — Query を実行しても全件返ってくる、または0件になる

「期待した件数と違う結果になる」

パーティションキーに入力した値が、実際に登録した値と完全に一致しているか見直してみましょう。また、「項目を探索」画面の操作モードがクエリになっているか、スキャンのままになっていないかも確認してみましょう。

Pitfall 02 — 同じ UserId・同じ OrderDate の項目を作ろうとして上書きされる

「項目数が思ったより少ない」

複合キーのテーブルでは、パーティションキーとソートキーの組み合わせでテーブル全体の一意性が決まります。同じ組み合わせの項目を登録しようとすると、新しい内容で上書きされてしまいます。各項目のソートキーの値が、本当にすべて異なっているかを見直してみましょう。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。DynamoDB コンソールを開いて、次を順に確かめましょう。

  • テーブルの詳細画面で、キースキーマにパーティションキーとソートキーの両方が表示されている。
  • 「項目を探索」の一覧で、登録した項目数が想定どおりになっている。
  • 特定の UserId で Query を実行した結果の件数が、そのユーザーに登録した項目数と一致している。
  • ソートキーの条件(比較演算子)を追加すると、結果件数がさらに減っている。
  • 同じ条件でスキャンを行った場合と比べて、Query の結果件数の違い(絞り込みの効き方の違い)が確認できる。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. ソートキーに「日時」を使うと、結果はどんな順番で返ってきそうでしょうか。
    ヒント
    ソートキーは、その名のとおりパーティション内での並び順を決める役割を持っています。文字列や数値としての大小関係が、結果の並び順にどう反映されそうか考えてみましょう。
  2. パーティションキーの値の種類(ユーザー数)が少なく、1つのパーティションキーに項目が極端に集中すると何が起きそうでしょうか。
    ヒント
    DynamoDB は内部的にパーティションキーの値を使ってデータを分散して保存しています。特定の値に項目が集中すると、その一部分だけに負荷が偏ってしまう可能性があります。
  3. 「あるユーザーの、ある日付以降の注文だけ」を取得したい場合、ソートキーの条件をどう指定すればよさそうでしょうか。
    ヒント
    パーティションキーで対象のユーザーを絞り込んだうえで、ソートキーに対してどの比較演算子を組み合わせれば「その日付以降」を表現できるか、今回試した条件を振り返ってみましょう。
10 — Clean up

後片づけ

作成したテーブルを削除して片づけましょう。

  1. 作成したテーブルを削除する:DynamoDB コンソールの「テーブル」一覧から、今回作成したテーブル(手順3で付けた名前、例:Orders)を選び、削除する。
Caution — 他で使っているテーブルは消さない

削除するのは、このハンズオンで自分が作ったものだけ

テーブルの一覧には、すでに別の用途で使っているテーブルが並んでいるかもしれません。間違えて削除しないよう、このハンズオンのために付けた名前のものだけを選んで削除してください。

コストに関する注意: DynamoDB はオンデマンドモードであれば使った分だけの課金で、今回程度の少量の読み書きは無料利用枠の範囲内に収まることが多いです。ただし、テーブルを削除せず放置すると、保存容量に応じた料金がわずかに発生し続ける点に注意してください。後片づけを忘れないようにしましょう。