[英]DynamoDB NoSQL design for queries
我希望存儲用戶事件的日志。 將會有很多條目,所以我認為DynamoDB會很好,因為其他所有內容都托管在這里。
我需要以兩種方式查詢這些事件,一個用戶針對某個日期(范圍)的事件總數,以及偶爾一次針對某個日期的所有事件。
我正在考慮將其作為user id
(密鑰), sequence number
(密鑰), date
, time
和duration
存儲在一個表中。
應該是多個表嗎? 如何最有效地做到這一點?
對於少量數據,此結構還可以。 請記住,序列號(您的范圍鍵)必須由您提供。 選擇日期作為unix時間戳(毫秒精度)作為排序鍵似乎是個好主意。
不需要額外的表。 但是,您的結構在很大程度上取決於您要實現的讀寫容量以及數據大小。
假設您的user_id是您的分區鍵。
對於每個不同的分區鍵值,所有表和索引項的總大小不能超過10 GB。 一個分區最多可支持3,000個讀取容量單位或1,000個寫入容量單位。
您需要考慮這些限制來創建分區鍵。 例如,一個非常活躍的用戶有很多事件,因此您需要超過1000個寫入容量單位。 不幸的是,您已選擇用戶ID作為分區。
在這種情況下,您只能使用1000個寫入容量單位,因此可能會出現故障。
您需要具有不同的結構。 例如,分區名稱,例如user_id_1 user_id_2等。因此,分區命名機制會根據您的應用程序的需要將數據擴展到分區。
檢查有關dynamodb限制的這些鏈接。
我建議您的事件表采用以下結構:
將事件時間戳記作為范圍鍵應該足以為事件提供唯一性(除非用戶可以在同一毫秒內立即擁有多個事件),因此您不需要序列號。
有了這樣的架構,您可以使用簡單的query獲取某個日期的用戶所有事件。
不幸的是,DynamoDB不支持聚合查詢,因此您無法快速獲取用戶的事件總數(必須查詢所有記錄並手動計算總數)。 因此,我建議為用戶事件統計信息創建一個單獨的表 ,如下所示:
因此,在將新記錄添加到事件表中之后,必須在統計信息表中為用戶增加事件計數器,如下所示:
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.