Глобальные и локальные вторичные индексы в DynamoDB - PullRequest
0 голосов
/ 29 апреля 2018

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

Например, здесь индекс GenreAlbumTitle должен быть GSI или LSI? https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

Кажется, я не могу понять, что мне нужна LSI, потому что любые индексы, которые мне нужны, должны охватывать целые строки таблицы, а не только отдельные разделы. И если кто-то также может коснуться аспекта затрат, потому что я понимаю, что LSI дешевле (но почему он дешевле)?

Спасибо всем!

1 Ответ

0 голосов
/ 30 апреля 2018

Каждый предмет в Динамо должен иметь уникальный первичный ключ . Первичный ключ - это индекс базовой таблицы. Первичный ключ должен иметь ключ раздела и может дополнительно иметь ключ диапазона (также называемый ключом сортировки). Внутри раздела элементы упорядочены по ключу диапазона. Быстрый доступ к элементам с помощью ключа раздела.

Вторичные индексы позволяют запрашивать таблицу с использованием альтернативного ключа. Локальный вторичный индекс (LSI) имеет тот же ключ разделения, что и первичный ключ (индекс), но другой ключ диапазона . Смысл LSI в том, что это те же данные, что и первичный индекс (ключ), просто упорядоченные по другому атрибуту.

Глобальный вторичный индекс (GSI) имеет ключ разделения, отличный от первичного ключа, и, следовательно, представляет собой другой набор данных.

Одним из важных различий между LSI и GSI является то, что LSI берет свою пропускную способность из базовой таблицы , где вы приобретаете пропускную способность GSI отдельно. Иными словами, LSI ничего не стоит, а GSI - дополнительные расходы по сравнению с базовой таблицей.

Давайте посмотрим на пример музыкального стола. Допустим, базовая таблица имеет эту схему;

Artist: (Primary Key) Partition Key
SongTitle: (Primary Key) Range Key
AlbumTitle:
DateOfRelease:

Эта таблица представляет собой список песен. Я могу получить доступ ко всем песням для исполнителя очень эффективно (то есть запрос исполнителя с помощью ключа раздела). Когда я сделаю этот запрос, песни будут заказаны SongTitle. Я также могу очень эффективно получать доступ к композициям Artist и SongTitle, используя уникальный первичный ключ.

Теперь допустим, что я хочу получить все песни от исполнителя, но по заказу DateOfRelease. В текущей схеме мне нужно было бы получить все песни и затем заказать их в моем приложении. Хорошей альтернативой было бы создание нового индекса с ключом раздела Artist и ключом диапазона DateOfRelease. Это будет БИС, поскольку ключ раздела индекса (Artist) совпадает с ключом раздела первичного ключа. Мне не нужно приобретать дополнительную пропускную способность, так как этот индекс будет выделяться из емкости базовой таблицы.

Теперь допустим, что я хочу получить доступ к песням по AlbumTitle, заказанным SongTitle, то есть создать списки альбомов. Для этого я создаю новый индекс с ключом раздела AlbumTitle и ключом диапазона SongTitle. Это GSI, потому что ключ раздела отличается от первичного ключа. Этот GSI должен предоставляться отдельно от базовой таблицы и, следовательно, стоит доплата.

В ответ на ваш вопрос GenreAlbumTitle - GSI, потому что он имеет ключ разделения, отличный от Music.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...