Подтвердить что ты не робот

Как вы запрашиваете DynamoDB?

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

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

Я абсолютно не знаком с NoSQL и нереляционными базами данных.

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

Или вы можете запустить полное сканирование таблицы и применить к нему фильтр. Уловка в том, что он будет сканировать только 1 Мб за раз, поэтому вам, вероятно, придется повторить сканирование, чтобы найти X количество результатов.

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

Для экземпляра, скажем, у меня есть клон Flickr. Таблица "Мои изображения" может выглядеть примерно так:

  • Идентификатор изображения (номер, первичный хэш-код)
  • Дата добавления (число, ключ основного диапазона)
  • Идентификатор пользователя (строка)
  • Теги (набор строк)
  • и т.д.

Таким образом, используя запрос, я смог бы перечислить все изображения за последние 7 дней и довольно легко ограничить их количеством X.

Но если бы я хотел перечислить все изображения от конкретного пользователя, мне нужно было бы выполнить полное сканирование таблицы и фильтр по имени пользователя. То же самое касается тегов.

И поскольку вы можете сканировать только 1 Мб за раз, вам может потребоваться несколько сканирований, чтобы найти X количество изображений. Я также не вижу способа легко остановить X-число изображений. Если вы пытаетесь захватить 30 изображений, ваше первое сканирование может найти 5, а второе может найти 40.

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

Или я полностью отсюда?

4b9b3361

Ответ 1

Да, вы правы в отношении компромисса между производительностью и гибкостью запросов.

Но есть несколько трюков, чтобы уменьшить боль - вторичные индексы/денормализация, вероятно, являются самыми важными.

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

Вам нужно решить, какие запросы вам нужны, а затем создать вокруг них модель данных.

Ответ 2

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

Эта таблица "схема" может быть:

    User ID (String, Primary Key)
    Date Added (Number, Range Key)
    Image ID (Number)

-

Таким образом, вы можете запросить идентификатор пользователя и фильтр по дате, а

Ответ 3

В качестве основного индекса вы можете использовать составной хеш-диапазон.

На странице DynamoDB:

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

Компонентный хеш-диапазон ключа индексируется как элемент хеш-ключа и ключевой элемент диапазона. Этот многочастный ключ поддерживает иерархию между значения первого и второго элементов. Например, составной ключ хеш-диапазона может быть комбинацией "UserID" (хеш) и "Временная метка" (диапазон). Удерживая элемент хэш-ключа постоянным, вы можете поиск по ключевому элементу диапазона для извлечения элементов. Это вы можете использовать API запросов для получения, например, всех элементов для один идентификатор пользователя в диапазоне временных меток.