9

私は DynamoDB を初めて使用し、テーブルがどのように見えるべきかという大きな混乱を抱えています。

ここで投稿を読みました: (まだ読んでいない人にはお勧めです) http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/BestPractices.html

そして今、DynamoDB の使用を開始するすべての人が直面すると思われるジレンマがいくつかあります。

まず、私のテーブル: STUDENTS、TEAMS、PROJECTS

STUDENTS : ID、年齢 ...

チーム: id、学生 1 の ID、学生 2 の ID、現在のプロジェクト、前のプロジェクト、最終更新日

プロジェクト: id、チーム ID、質問のリスト、student1answers のリスト、student2answers のリスト

いくつかのコメント:

  1. ご覧のとおり、範囲キーは使用しません。する必要がありますか?.
  2. 各回答は、(質問の数、テキスト、挿入日) の json です。
  3. すべての生徒が複数のチームに所属できます。

私のジレンマ:

  1. 特定の日付以降に更新された特定の学生のすべてのチームを取得したいと考えています。

今のところ、2 つのスキャン操作を使用しています。1 つは Student1 を検索し、もう 1 つは Student2 を検索します。

       **Is there a better way ?**

新しいテーブルを追加することを考えました: user-Battles: student-id, team-id そのため、特定の学生のチームをクエリしてから、すべてのチームを batch_get_item できますが、last-update-on はどうですか? batch_get_item 内でこれを使用してクエリを実行するにはどうすればよいですか?

  1. プロジェクトが終了したら、もう使用しません。古いアイテムをどうするか?消去 ?それらを別のテーブルに移動しますか?

  2. プロジェクトテーブルで更新できる属性はアンサー属性なので、パフォーマンス用に別のテーブルに移動しようと思います。

更新が 2 回だけの場合、本当に移動する必要がありますか? (学生1が回答を送信したときと学生2が回答を送信したとき-そしてプロジェクトは古いです)

*回答用の新しいテーブルを作成する場合、JSON 形式で保存する必要はありません

どのようにテーブルを設計しますか? 私にお知らせください。

4

1 に答える 1

3

多くの詳細を含む素敵な質問:)

1つだけアドバイスするとしたら、次のようになります。

NoSQL では、データを非正規化することをお勧めします。

これは、あなたの「ジレンマ」にとって、あなたの提案はかなり良かったと言いました。として日付を非正規化する必要がありrange_keyます。1 つの方法は、次のようにテーブルを追加することです。

  • hash_key: 学生
  • range_key: 日にち
  • team: team_id

それでも、テーブルは成長し続けるため、これは完璧ではありません。更新ごとに新しいオブジェクトが挿入されます。実際、キーを編集することはできません。独自のクリーニング コードを実行する必要があります。

DynamoDB では、「古い」アイテム (スキャンを除く) によるパフォーマンスの低下を心配する必要はありません。これが DynamoDB の主な強みです。それにもかかわらず、これは常にデータをきれいに保ちながら一貫性を保つための良い方法です。期限切れのプロジェクトの移動を開始する場合は、それらすべてを移動しないと、データがどこにあるのかわからなくなります。

最後の提案: オブジェクトを説明するのに「ID」が最適ですか? ほとんどの場合、名前、日付、または任意の一意の属性がより適切なキーになります。

于 2012-10-05T18:41:40.067 に答える