Могу ли я иметь несколько записей под одним и тем же первичным ключом при использовании DynamoDB? - PullRequest
0 голосов
/ 08 января 2019

В настоящее время я развиваю навык, который будет менеджером портфеля акций. Я хочу, чтобы таблица имела три заголовка

  1. UserID (который приходит из Alexa)
  2. Название акции
  3. Количество на складе

UserID является первичным ключом, и в настоящее время я могу добавить количество запаса в таблицу, а затем в отдельном методе, называемом GetPortfolioValue, выполнить запрос к базе данных, чтобы вернуть имя запаса и сумму запаса для определенного идентификатора пользователя, который я буду затем выполните некоторые математические расчеты, чтобы вернуть значение Portfolio.

Проблема в том, что я не могу добавить еще одну запись под первичным ключом, и поэтому в портфеле может быть только один опцион на акции, что отстой

Я хочу позже иметь возможность редактировать портфель в случае, если пользователь продаст часть своих акций.

Есть ли способ сделать это с помощью DynamoDB?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Да, если вы используете userId из запросов от Alexa, они предоставят отличный первичный ключ для вашей базы данных DynamoDB.

"user": {
  "userId": "amzn1.ask.account.[unique-value-here]",

Просто сохраните акции в виде объекта JSON для каждого пользователя.

{
  "stocks": [
    {
      "stockAmount": 45,
      "stockName": "AMZN"
    }
  ]
}

Хранение объекта

DynamoDB dynamo = new DynamoDB(new AmazonDynamoDBClient(...)); 
Table stocks = dynamo.getTable("stocks");

String json = {"stocks": [{"stockAmount": 45,"stockName": "AMZN"}]}

Item item =
  new Item()
      .withPrimaryKey("alexa_id", 1)
      .withJSON("document", json);

table.putItem(item);

и как вернуть обратно

DynamoDB dynamo = new DynamoDB(new AmazonDynamoDBClient(...)); 
Table table = dynamo.getTable("stocks"); 

Item documentItem =
  table.getItem(new GetItemSpec()
                .withPrimaryKey("alexa_id", 1)
                .withAttributesToGet("document"));

System.out.println(documentItem.getJSONPretty("document"));

Поскольку ваши пользователи добавляют или удаляют акции, вам необходимо добавить их в массив акций для пользователя. На вас будет распространяться ограничение в 400 КБ для каждого из ваших элементов DynamoDB. Размер данного элемента включает имя атрибута (в UTF-8) и значение атрибута.

0 голосов
/ 08 января 2019

Первичные ключи должны быть уникальными. Вероятно, вам нужен составной первичный ключ UserID + Stock Name. В DynamoDB это достигается установкой UserID в качестве хеш-ключа и Stock Name в качестве ключа сортировки в индексе первичной таблицы.

...