первичный ключ базы данных DynamoDB или другой

Я использую DynamoDB для улучшения навыков работы с Alexa. В документации к DynamoDB сказано, что первичный ключ (и любые вторичные индексы) должны быть одного из трех типов: двоичный, строковый, числовой. Мне было интересно, есть ли способ поиска в базе данных с использованием массива или таких вещей, как «теги», чтобы попытаться сопоставить элемент в базе данных с наиболее подходящими «тегами», используемыми для поиска элементов. Если это невозможно с DynamoDB, существуют ли другие базы данных, которые поддерживают эту функцию? В противном случае, какую службу я мог бы использовать (помимо базы данных), которая позволила бы мне выполнять такие запросы?


person An Ignorant Wanderer    schedule 18.03.2019    source источник


Ответы (2)


DynamoDB был разработан для быстрого чтения / записи и огромного масштабирования. Лучший способ использовать DynamoDB - это сбросить систему данных записи, а затем получить доступ к целому объекту с использованием некоторого идентификатора. Были сделаны некоторые компромиссы, чтобы обеспечить скорость. Один из них - сложные запросы. В вашем случае я думаю, что ElasticSearch лучший вариант.

person Nirdosh Gautam    schedule 18.03.2019
comment
Спасибо за ваш ответ. Итак, если я использую ElasticSearch, как будут использоваться теги в базе данных? Я имею в виду, что первичный ключ по-прежнему должен быть одним из следующих: строковый, двоичный, числовой? - person An Ignorant Wanderer; 18.03.2019

С DynamoDB вы можете добиться этого, если ваш первичный ключ состоит из

  • ключ раздела (уникальный идентификатор для каждого элемента) и
  • ключ сортировки (конкретный тег)

Это приводит к сохранению дублирующихся данных, так как вам нужно будет хранить данные элемента для каждого из тегов, чтобы разрешить быстрые запросы по ключам.

Структура будет примерно такой

Partition (ID) | Sort (Tag) | other attributes
1234           | node.js    | { timestamp: "...", message: "...", ... }
1234           | database   | { timestamp: "...", message: "...", ... }
1234           | alexa      | { timestamp: "...", message: "...", ... }

Обратите внимание, что ключ раздела (ID) одинаков для каждого элемента, но ключ сортировки (тег) изменяется. Остальные атрибуты могут быть любыми, но в этом случае они дублируются. Другие элементы будут добавлены аналогичным образом с их уникальным идентификатором в качестве ключа раздела и тегами в качестве ключа сортировки, по одному на элемент.

Эта модель действительно оптимизирована для быстрого чтения. Когда тег удаляется из элемента, вы должны удалить элемент соответственно.

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

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

person kaskelotti    schedule 18.03.2019
comment
Спасибо за ваш ответ. Дело в том, что ключ сортировки также ограничен String, Binary и Number. Позвольте мне немного прояснить то, о чем я прошу. Допустим, у меня есть элемент в базе данных, и я хочу пометить его более чем одной строкой, чтобы я мог искать его позже (я хочу использовать эти теги в качестве ключей). Допустим, у меня есть элемент, представляющий песню, и я хочу отметить его, как «мне нравится», «фаворит», «рок». и т. д. В то же время каждая песня имеет разное количество таких тегов, поэтому я не могу создать предопределенные столбцы, которые классифицируют эти теги для каждого элемента. - person An Ignorant Wanderer; 18.03.2019
comment
Итак, теперь предположим, что у меня есть несколько тегов, и я хочу найти в базе данных элемент с наиболее подходящими тегами. Как мне это сделать? - person An Ignorant Wanderer; 18.03.2019
comment
Таким образом, вам нужно будет получить предметы, указав только тег. AFAIK в этом случае вам нужно иметь тег в качестве ключа раздела. У вас может быть несколько индексов для каждой таблицы в Dynamo для поддержки ваших запросов. Но опять же, это привело бы к (даже большему?) Дублированию. К сожалению, я не могу дать вам прямого решения. Прочтите этот подробный ответ о сопоставлениях Dynamo DB и следуйте ссылкам на внешние ресурсы. И вы также можете подумать, что, возможно, DynamoDB тоже не лучший вариант для этой работы, и, возможно, реляционная база данных подойдет лучше. Удачи! - person kaskelotti; 19.03.2019