Как использовать автоматическое приращение для идентификатора первичного ключа в 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);