2017-02-16 4 views
2

私はユーザーイベントのログを保存しようとしています。私はDynamoDBが他のすべてがそこにホストされているので、良いと思ったので、それはたくさんのエントリーになるでしょう。DynamoDBクエリ用NoSQLデザイン

私はこれらのイベントを2つの方法で照会する必要があります.1つは日付(範囲)のユーザーのイベントの合計、ある場合は日付のすべてのイベントです。

私はuser id(キー)、sequence number(キー)、datetimedurationように、1つのテーブルに保存することを考えていました。

複数のテーブルにする必要がありますか?これはどのようにして最も効率的に行うことができますか?

+0

シーケンス番号とは何ですか?イベントを参照するための自動増分フィールドのようなものか、それとも何ですか?もう1つの質問:すべてのユーザーのすべてのイベント、または特定のユーザーのすべてのイベントを照会しますか? – xtx

+0

各行を一意にするためのシーケンス番号があり、これを提供します。一度に1人のユーザーに問い合わせるだけで済みます。 – Gustaf

答えて

0

少量のデータの場合、この構造は問題ありません。 シーケンス番号(範囲キー)は、あなたが提供しなければならないことに注意してください。ソートキーとしてミリ秒の精度で日付をUnixタイムスタンプとして選択することをお勧めします。

余分なテーブルは必要ありません。 しかし、あなたの構造は、達成したい読み出し書き込み容量とデータサイズに大きく依存します。

user_idがパーティションキーであるとします。

各パーティションキーの値ごとに、すべてのテーブルおよびインデックスアイテムの合計サイズは10 GBを超えることはできません。 単一パーティションでは、最大3,000の読み取り容量単位または1,000の書き込み容量単位をサポートできます。

これらの制限を考慮してパーティションキーを作成する必要があります。 たとえば、非常にアクティブなユーザーには多くのイベントがあるため、1000を超える書き込み容量が必要です。残念ながら、パーティションとしてユーザーIDを選択しました。

この場合、書き込み容量は1000単位に制限されているため、障害が発生する可能性があります。

あなたは別の構造を持つ必要があります。たとえば、パーティション名は user_id_1 user_id_2などです。したがって、アプリケーションのニーズに応じてパーティションにデータを広げるパーティション命名メカニズムがあります。

dynamodbの制限については、これらのリンクを確認してください。

Tables guidancePartition distribution

0

私はあなたのイベント表については、以下の構造を示唆している:

  • ユーザID -
  • キー
  • ハッシュイベントの日付/時間(ミリ秒単位でタイムスタンプ) - 範囲をキー
  • 期間

イベントタイムスタンプを範囲キーとして使用すると、(ユーザーが同じミリ秒で複数のイベントを持つことができない限り)イベントの一意性を確保するのに十分なはずです。シーケンス番号は必要ありません。

このようなスキーマを持つと、単純なqueryを使用して、日付のユーザーのすべてのイベントを取得できます。

残念ながら、DynamoDBは集約クエリをサポートしていないため、ユーザーのイベントの合計数をすばやく取得することはできません(すべてのレコードをクエリし、合計を手動で計算する必要があります)。 だから私はこのようなユーザーイベント統計の別のテーブル作成することをお勧め:

  • ユーザID - キー
  • ハッシュ
  • 日 - レンジキー
  • events_cnt(ユーザーのためのイベントの合計数をあなたは、イベントテーブルに新しいレコードを追加した後、以下に示すよう

ので日付)のために、あなたはイベントが統計表にユーザーのための対抗インクリメントする必要があります。

var dynamodbDoc = new AWS.DynamoDB.DocumentClient(); 
var params = { 
    TableName : "user_events_stats", 
    Key: { 
     userId: "65716110-f4df-11e6-bc64-92361f002671" , 
     date: "2017-02-17", 
    }, 
    UpdateExpression: "SET #events_cnt = if_not_exists(#events_cnt, :zero) + :one", 
    ExpressionAttributeNames: { 
     "#events_cnt": "events_cnt", 
    }, 
    ExpressionAttributeValues: { 
     ":one": 1, 
     ":zero": 0, 
    }, 
}; 

dynamodbDoc.update(params, function(err, data) { 

}); 
関連する問題