Как использовать автоматическое приращение для идентификатора первичного ключа в dynamodb
Я новичок в dynamodb. Я хочу автоматически увеличивать значение id, когда я использую putitem
с dynamodb.
Можно ли это сделать?
Ответы
Ответ 1
DynamoDB не предоставляет это из коробки. Вы можете сгенерировать что-то в своем приложении, такое как UUID, который "должен" быть уникальным для большинства систем.
Я заметил, что вы использовали Node.js(я удалил тэг). Вот библиотека, которая обеспечивает функциональность UUID: node-uuid
Пример из README
var uuid = require('node-uuid');
var uuid1 = uuid.v1();
var uuid2 = uuid.v1({node:[0x01,0x23,0x45,0x67,0x89,0xab]});
var uuid3 = uuid.v1({node:[0, 0, 0, 0, 0, 0]})
var uuid4 = uuid.v4();
var uuid5 = uuid.v4();
Ответ 2
Это анти-шаблон в DynamoDB, который построен для масштабирования во многих разделах/осколках/серверах. DynamoDB не поддерживает автоматические инкрементные первичные ключи из-за ограничений масштабирования и не может быть гарантирован на нескольких серверах.
Лучшая опция - собрать первичный ключ из нескольких индексов. Первичный ключ может быть до 2048 байт. Есть несколько вариантов:
- Используйте UUID как ваш ключ - возможно, UUID, основанный на времени, который делает его уникальным, равномерно распределенным и несет значение времени
- Использовать случайно сгенерированное число или временную метку + случайное (возможно, смещение бит), например: ts < 12 + random_number
- Используйте другую службу или сам DynamoDB для генерации инкрементного уникального идентификатора (требуется дополнительный вызов)
Следующий код будет автоматически увеличивать счетчик в DynamoDB, а затем вы можете использовать его как первичный ключ.
var documentClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: 'sampletable',
Key: { HashKey : 'counters' },
UpdateExpression: 'ADD #a :x',
ExpressionAttributeNames: {'#a' : "counter_field"},
ExpressionAttributeValues: {':x' : 1},
ReturnValues: "UPDATED_NEW" // ensures you get value back
};
documentClient.update(params, function(err, data) {});
// once you get new value, use it as your primary key
Мой личный фаворит использует timestamp + random, вдохновленный созданием кода Instagram Sharding ID на http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram
var EPOCH = 1300000000000;
function generateRowId(subid) {
var ts = new Date().getTime() - EPOCH; // limit to recent
var randid = Math.floor(Math.random() * 512);
ts = (ts * 64); // bit-shift << 6
ts = ts + subid);
return (ts * 512) + (randid % 512);
}
var newPrimaryHashKey = "obj_name:" + generateRowId(4);