Я использую DynamoDB для улучшения навыков работы с Alexa. В документации к DynamoDB сказано, что первичный ключ (и любые вторичные индексы) должны быть одного из трех типов: двоичный, строковый, числовой. Мне было интересно, есть ли способ поиска в базе данных с использованием массива или таких вещей, как «теги», чтобы попытаться сопоставить элемент в базе данных с наиболее подходящими «тегами», используемыми для поиска элементов. Если это невозможно с DynamoDB, существуют ли другие базы данных, которые поддерживают эту функцию? В противном случае, какую службу я мог бы использовать (помимо базы данных), которая позволила бы мне выполнять такие запросы?
первичный ключ базы данных DynamoDB или другой
Ответы (2)
DynamoDB был разработан для быстрого чтения / записи и огромного масштабирования. Лучший способ использовать DynamoDB - это сбросить систему данных записи, а затем получить доступ к целому объекту с использованием некоторого идентификатора. Были сделаны некоторые компромиссы, чтобы обеспечить скорость. Один из них - сложные запросы. В вашем случае я думаю, что ElasticSearch лучший вариант.
С DynamoDB вы можете добиться этого, если ваш первичный ключ состоит из
- ключ раздела (уникальный идентификатор для каждого элемента) и
- ключ сортировки (конкретный тег)
Это приводит к сохранению дублирующихся данных, так как вам нужно будет хранить данные элемента для каждого из тегов, чтобы разрешить быстрые запросы по ключам.
Структура будет примерно такой
Partition (ID) | Sort (Tag) | other attributes
1234 | node.js | { timestamp: "...", message: "...", ... }
1234 | database | { timestamp: "...", message: "...", ... }
1234 | alexa | { timestamp: "...", message: "...", ... }
Обратите внимание, что ключ раздела (ID) одинаков для каждого элемента, но ключ сортировки (тег) изменяется. Остальные атрибуты могут быть любыми, но в этом случае они дублируются. Другие элементы будут добавлены аналогичным образом с их уникальным идентификатором в качестве ключа раздела и тегами в качестве ключа сортировки, по одному на элемент.
Эта модель действительно оптимизирована для быстрого чтения. Когда тег удаляется из элемента, вы должны удалить элемент соответственно.
Но тогда некоторые данные в элементе изменяются, например, атрибут сообщения, вам нужно изменить каждый элемент, что приводит к многократной записи. Кроме того, записи не будут атомарными, что может привести к устареванию некоторых данных.
Конечно, все зависит от того, какие еще запросы данных нужны вашему приложению, и от количества операций чтения и записи, которые у вас будут, независимо от того, будет ли этот подход допустимым или нет.