Я хотел бы предложить следующую структуру для вашей таблицы событий:
- идентификатор пользователя - хэш-ключа
- Дата события/времени (временная метка с миллисекундах) - диапазон ключ
- продолжительность
Наличие метки времени в качестве ключа диапазона должно быть достаточным для обеспечения уникальности события (если только пользователь не может иметь несколько событий в той же миллисекунде), поэтому вам не нужен порядковый номер.
Имея такую схему, вы можете получить все события для пользователя для даты, используя простой query.
К сожалению, DynamoDB не поддерживает агрегированные запросы, поэтому вы не можете быстро получить общее количество событий для пользователя (вам придется запрашивать все записи и вычислять итоговые вручную). Поэтому я бы предложил создать отдельную таблицу для статистики пользовательских событий, как это:
- идентификатора пользователя - хэш-ключ
- даты - диапазон ключей
- 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) {
});
Каков порядковый номер? Предполагается, что это как поле автоинкремента только для ссылки на событие или что? Другой вопрос: хотите ли вы запросить все события для даты для всех пользователей или всех событий для определенного пользователя? – xtx
У нас есть порядковый номер, чтобы сделать каждую строку уникальной, и мы это обеспечиваем. Нам нужно только запрашивать одного пользователя за раз. – Gustaf