UUID для DynamoDB? - PullRequest
       6

UUID для DynamoDB?

34 голосов
/ 24 января 2012

Можно ли заставить DynamoDB автоматически генерировать уникальные идентификаторы при добавлении новых элементов в таблицу?

Я заметил, что Java API упоминает @DynamoDBAutoGeneratedKey, поэтому я предполагаю, что есть способ заставить это работать и с PHP.

Если это так, генерирует ли код приложения эти идентификаторы или это делается на стороне DynamoDB?

Ответы [ 6 ]

22 голосов
/ 24 января 2012

Хороший вопрос - хотя концептуально это возможно, в настоящее время это не представляется возможным в качестве функции уровня API DynamoDB, поскольку ни CreateTable , ни PutItem не относятся к такой функции.

Заметка @DynamoDBAutoGeneratedKey, которую вы заметили, является аннотацией Java , то есть синтаксическим сахаром, предлагаемым Java SDK действительно:

Аннотация на языке программирования Java - этоспециальная форма синтаксических метаданных, которые могут быть добавлены в исходный код Java.

Таким образом, @DynamoDBAutoGeneratedKey является одной из Amazon DynamoDB Annotations , предлагаемой как часть Модель персистентности объектов в высокоуровневом API Java SDK (см. Использование модели персистентности объектов с Amazon DynamoDB ):

Отмечает свойство хеш-ключа или ключа диапазона какбудучи автоматически сгенерированным.Модель сохраняемости объектов будет генерировать случайный UUID при сохранении этих атрибутов.Только свойства String могут быть помечены как автоматически сгенерированные ключи.

1 голос
/ 26 января 2018

Используя основанную на схеме библиотеку сопоставления данных Dynamodb AWS в Node.js , хэш-ключ (id) будет сгенерирован автоматически. Автоматически сгенерированные идентификаторы основаны на uuid v4.

Для получения более подробной информации посмотрите следующий пакет aws.

Data Mapper с аннотацией

Пакет Data Mapper для Javascript

Пример фрагмента

@table('my_table')
class MyDomainClass {
    @autoGeneratedHashKey()
    id: string;

    @rangeKey({defaultProvider: () => new Date()})
    createdAt: Date;
}
0 голосов
/ 02 апреля 2019

Клиент может создать (для всех намерений и целей) уникальный идентификатор, либо выбрав длинный случайный идентификатор (например, DynamoDB поддерживает 128-разрядные целые числа), либо выбрав идентификатор, который содержит IP-адрес клиента, номер ЦП и текущее время - или что-то в этом роде. Стандарт UUID даже включает стандартный способ сделать это (и у вас есть библиотеки на разных языках для создания таких UUID на стороне клиента), но вам на самом деле не нужно использовать стандарт. И интересный вопрос, как вы планируете найти эти предметы, если у них есть случайные ключи. Или вы планируете использовать вторичный индекс?

0 голосов
/ 03 ноября 2017

При работе с динамодабом в javascript с помощью nodejs. Я использую модуль npm uuid для генерации уникального ключа.

Ex:

ID = uuid.v1 ();

см .: uuid npm

0 голосов
/ 06 июня 2015

Вот еще один хороший метод, взятый из mkyong

http://www.mkyong.com/java/how-to-get-current-timestamps-in-java/

Я настроил его метод, чтобы получить миллисекунды вместо фактической даты

java.util.Date date= new java.util.Date();
System.out.println(new Timestamp(date.getTime()).getTime());
0 голосов
/ 10 ноября 2012

Подход, который я использую, заключается в том, чтобы использовать текущую временную метку для хэш-клавиши (или клавиши диапазона, если тоже используется клавиша диапазона).Сохраните метку времени как целое число, представляющее количество миллисекунд с начала «эпохи UNIX» (в часовом поясе UTC).Многие библиотеки даты / времени могут создать это число для вас.

Это имеет то преимущество, что если вы хотите, чтобы в вашей таблице было поле «время создания», ваш UUID уже хранит эту информацию.Просто вызовите другой метод в вашей библиотеке даты / времени, чтобы преобразовать отметку времени в читаемый формат.

(Обязательно обработайте исключение, которое произойдет, если второй элемент будет создан в той же таблице с той же отметкой времени в миллисекундах; просто отступите и повторите операцию в этом случае, с чуть более поздней текущей отметкой времени.)

Например:

User table

только для хеш-ключа: userID (отметка временио создании этого пользователя).

WidgetAttributes table

хэш-ключ плюс ключ диапазона.hash-key: userID (используйте userID из таблицы User пользователя, которому принадлежит виджет).range-key: attribID (используйте метку времени создания этого атрибута виджета).

Теперь вы можете запускать операции «запрос» в таблице WidgetAttributes, чтобы получить все атрибуты виджета для определенного пользователя.;используя «больше нуля» в качестве параметра запроса для ключа диапазона.

...