2016-04-27 11 views
1

DynamoDBにMessagesテーブルがあります。送信者、タイムスタンプ、メッセージ、受信者の4つの列があります。私は、4つの列のいずれかを使用してパーティションキーを作成するのではなく、送信者を連結する別の列を作成しないでください&タイムスタンプ&受信者。DynamoDBのパーティションキーの最適化

この列には、JohnSmithID1461754484307SallyMcDonaldIDのようなデータが格納されます。

このようにすると、特定の送信者&受信者のコンボからメッセージを検索するときに、この1つの列を使用してクエリ(like & end with)を使用してクエリできます。この列を利用するにはいくつかの方法があります。

質問1.クエリをいくつかの列に分散するのではなく、1つの列を使用することで、ここで問題が複雑になりますか?

質問2.この方向をとることで、パフォーマンスが大幅に向上しますか?

質問3データサイズの目的で、SenderId &の列を削除すると、このデザインパターンは価値がありますか? (私はソートキーのタイムスタンプ列が必要です)

答えて

4

もう一度how DynamoDB partition keys workを読む必要があると思います。クエリの完全なパーティションキーを提供する必要があるため、パーティションキーで「begin with」や「end with」などのクエリを実行することはできません。このような条件は、ソートキーにのみ指定できます(ただし、begins_withファンクションがありますが、ends_withファンクションです)。

あなたの考えは、クエリの代わりにスキャンを使用することに基づいているかもしれませんが(質問2に関して)、これは、テーブル内のすべての項目をDynamoDBが調べなければならないため、クエリの柔軟性を増やしたい場合は、secondary indexesを1つ以上定義することができます。

あなた自身で質問3に答えることができます:DynamoDBボリュームは非常に高価ですが、1エントリあたり20バイトの違いがあります。テーブルに10.000.000を超えるエントリがあると、これが問題になることがあります。それ以外の場合は無視してください。

1

問合せ時にパーティション・キーに条件を設定することができないため、この例は機能しません。ソートキーには、そのような条件しか設定できません。

しかし、この種の構造は時々便利になるかもしれません。たとえば、クエリを実行する3つの属性があるとします。 DynamoDBでは、パーティションキー+ソートキーを2つまで使用できます。そのため、1つの場合は2つ以上の属性を組み合わせることができます。

+0

私は3つのフィルタパラメータを使用してクエリを実行したいと言っていますが、セカンダリインデックスを3つの列すべてに配置したにもかかわらず、dynamodbテーブルを使用するため、 – shle2821

+0

@ shle2821私は、3つ以上の属性の組み合わせで定義できる項目を照会する必要がある場合を想定しています。 DynamoDBでは、最大2つの属性(パーティションキー+ソートキー)を使用してプライマリキーを作成できます。詳細情報[ここをクリック](http://stackoverflow.com/questions/32620215/3-fields-composite-primary-key-unique-item-in-dynamodb) –

+0

情報ありがとうございます。それから、私にあなたにこれを聞かせてください。プライマリキーだけを残したまま、senderID&timestamp&recipientIDに基づいてソートキーを作成しますか?したがって、ユーザーのデバイスは3つの属性を連結し、DynamoDBに送信します。これはソートキーであるため、「begin with」、「end with」などで照会することができます。このデザインパターンについてはどう思いますか? – shle2821