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