簡體   English   中英

DynamoDB NoSQL查詢設計

[英]DynamoDB NoSQL design for queries

我希望存儲用戶事件的日志。 將會有很多條目,所以我認為DynamoDB會很好,因為其他所有內容都托管在這里。

我需要以兩種方式查詢這些事件,一個用戶針對某個日期(范圍)的事件總數,以及偶爾一次針對某個日期的所有事件。

我正在考慮將其作為user id (密鑰), sequence number (密鑰), datetimeduration存儲在一個表中。

應該是多個表嗎? 如何最有效地做到這一點?

對於少量數據,此結構還可以。 請記住,序列號(您的范圍鍵)必須由您提供。 選擇日期作為unix時間戳(毫秒精度)作為排序鍵似乎是個好主意。

不需要額外的表。 但是,您的結構在很大程度上取決於您要實現的讀寫容量以及數據大小。

假設您的user_id是您的分區鍵。

對於每個不同的分區鍵值,所有表和索引項的總大小不能超過10 GB。 一個分區最多可支持3,000個讀取容量單位或1,000個寫入容量單位。

您需要考慮這些限制來創建分區鍵。 例如,一個非常活躍的用戶有很多事件,因此您需要超過1000個寫入容量單位。 不幸的是,您已選擇用戶ID作為分區。

在這種情況下,您只能使用1000個寫入容量單位,因此可能會出現故障。

您需要具有不同的結構。 例如,分區名稱,例如user_id_1 user_id_2等。因此,分區命名機制會根據您的應用程序的需要將數據擴展到分區。

檢查有關dynamodb限制的這些鏈接。

表指導分區分配

我建議您的事件表采用以下結構:

  • 用戶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) {

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM