SimpleDB Select VS DynamoDB Scan

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

Я храню фактические объекты на Amazon S3, а ключи в базе данных, перечисление ключей Amazon S3 выполняется медленно. Так что лучше для хранения ключей?

Это мои знания SimpleDB и DynamoDB:

SimpleDB:

  • Дешевый
  • Хорошо работает
  • Предназначен для малых / средних наборов данных
  • Может выполнять запросы с использованием выражений выбора

DynamoDB:

  • Дорогостоящий
  • Чрезвычайно масштабируемый
  • Отлично выполняет; миллисекундный ответ
  • Невозможно запросить

Насколько я понимаю, эти моменты верны, DynamoDB - это больше убийца. скорость и масштабируемость, SimpleDB больше ориентирован на запросы и цену (при этом обеспечивая хорошую производительность). Но если вы посмотрите на это так, что будет быстрее, если вы загрузите ВСЕ ключи из DynamoDB или выполните запрос выбора с помощью SimpleDB ... жестко, верно? Один использует невероятно быструю базу данных для загрузки лота (а затем мы должны сопоставить их), а другой использует базу данных с достаточно хорошей производительностью для запроса и загрузки нескольких правильных объектов. Итак, что быстрее:

DynamoDB загружает все и сопоставляет ИЛИ SimpleDB запрашивает и загружает это

(ПРИМЕЧАНИЕ: соответствие просто означает использование -rangeOfString и сравнения строк, ничего энергоемкого или неэффективного по времени или чего-либо еще на стороне сервера)

Мои ключи S3 будут использовать этот формат для каждого типа объекта.

accountUsername: typeOfObject: randomGeneratedKey

Например. Если вы ссылаетесь на объект учетной записи

Рохан: Аккаунт: shd83SHD93028rF

Или изображение профиля:

Рохан: Профиль Фото: Nck83S348DD93028rF37849SNDh

У меня есть случайно сгенерированный ключ для уникальности, он ни на что не ссылается, он просто есть, чтобы ключи не повторялись, поэтому перекрывали два объекта.

В своем приложении я могу выбрать SimpleDB или DynamoDB, поэтому есть два варианта:

  • Используйте SimpleDB, сохраняйте ключи в формате, но не используйте формат для какой-либо ссылки, вместо этого используйте атрибуты, хранящиеся в SimpleDB. Итак, я храню ключ с такими атрибутами, как имя пользователя, тип и, возможно, другими, которые мне также нужно будет включить в формат ключа. Итак, если я хочу получить объект учетной записи от пользователя «Рохан». Я просто использую SimpleDB Select для запроса атрибута «имя пользователя» и атрибута «тип». (где я соответствую "счету")

  • DynamoDB, ключи хранилища и каждый ключ будут иметь иллюстрированный формат. Я просматриваю всю базу данных, возвращая каждый ключ. Затем получите ключ и воспользуйтесь преимуществом формата ключа, я могу использовать -rangeOfString, чтобы сопоставить те, которые я хочу, а затем загрузить с S3.

Кроме того, SimpleDB, очевидно, географически распределен, но как я могу это включить?

Итак, что быстрее и надежнее? Использование SimpleDB для запроса ключей с атрибутами. Или с помощью DynamoDB для хранения всех ключей, сканирования (загрузки всех ключей) и сопоставления, например, -rangeOfString? Имейте в виду, что это всего лишь короткие ключи, которые являются указателями на объекты S3.

Вот мой последний вопрос, и количество объектов в базе данных будет зависеть от принятого ответа, если я:

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

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

Так что ты думаешь?

Спасибо за помощь! Я назначил награду за это, действительно нужен ответ как можно скорее.


person Community    schedule 04.01.2013    source источник
comment
Несколько замечаний для ясности: 1. DynamoDB действительно имеет операцию запроса, для этого просто требуется использование RangeKey. 2. Операция сканирования позволяет находить данные по всей таблице, но не требует загрузки всей таблицы. 3. SimpleDB имеет избыточные реплики в том же регионе, в котором был создан ваш домен, и не действует как CDN для вашей базы данных.   -  person Bob Kinney    schedule 07.01.2013
comment
@BobKinney, что вы имеете в виду, когда можете найти данные по всей таблице, но не должны их загружать?   -  person MCKapur    schedule 08.01.2013
comment
Я имею в виду именно то, что я сказал. Операция сканирования будет сканировать все данные в таблице DynamoDB и возвращать только те элементы в таблице, которые соответствуют вашим параметрам сканирования, и только они должны быть загружены в ваше приложение. Операции сканирования могут быть связаны так, что вы будете искать только первые N совпадающих результатов, но при этом будет использоваться столько пропускной способности чтения, сколько необходимо для поиска этих N результатов.   -  person Bob Kinney    schedule 09.01.2013
comment
@BobKinney О, хорошо, так что предположим, что SimpleDB и DynamoDB имеют по 10 000 ключей, будут выбирать быстрее или сканировать, а затем соответствовать   -  person MCKapur    schedule 10.01.2013
comment
У меня нет точных цифр, поэтому я не могу говорить о реальной производительности, но здесь играет не только количество клавиш. Я рекомендую вам провести несколько небольших тестов и сделать собственное суждение, понимая, что в целом DynamoDB будет лучше масштабироваться.   -  person Bob Kinney    schedule 10.01.2013
comment
@BobKinney Спасибо за обсуждение, помогло, я собираюсь создать хороший набор данных для обоих (цикл) и начать проводить некоторые тесты.   -  person MCKapur    schedule 10.01.2013
comment
Как насчет Google Cloud Storage через JSON API. Вы можете запросить ключ.   -  person Kyaw Tun    schedule 11.01.2013
comment
@KyawTun Я хочу использовать AWS, у него отличный API для iOS и документация, он дешев и имеет набор полезных сервисов.   -  person MCKapur    schedule 11.01.2013


Ответы (1)


Ух ты! Что за вопрос :)

Хорошо, давайте обсудим некоторые аспекты:

S3

Производительность S3, скорее всего, низкая, поскольку вы не добавляете префикс для ключей листинга.

Если вы выполняете сегментирование, сохраняя такие объекты, как: type/owner/id, перечисление всех идентификаторов для данного владельца (с префиксом type / owner /) будет быстрым. Или, по крайней мере, быстрее, чем перечислять все сразу.

Dynamo против SimpleDB

В общем, вот мой совет:

  • Используйте SimpleDB, когда:

    • Your entity storage isn't going to pass over 10GB
    • Вам нужно применять сложные запросы, включающие несколько полей
    • Ваши запросы нечетко определены
    • Вы можете использовать многозначные типы данных
  • Используйте DynamoDB, когда:

    • Your entity storage will pass 10GB
    • Вы хотите масштабировать спрос / пропускную способность по мере продвижения
    • Ваши запросы и модель четко определены и вряд ли изменятся.
    • Ваша модель динамична, включает свободную схему
    • Вы можете кэшировать свои запросы на стороне клиента (так что вы можете сэкономить на пропускной способности, запрашивая кеш до Dynamo)
    • Вы хотите делать сводные / сводные сводки с помощью атомарных обновлений

Учитывая ваше текущее описание, кажется, что SimpleDB на самом деле лучше, поскольку: - Ваша модель не полностью определена - Вы можете отложить некоторые аспекты принятия решения, поскольку требуется время, чтобы достичь пределов (10 ГБ)

Географический SimpleDB

Это не поддерживает. Работает только у нас-восток-1 афаик.

Ключевые Именование

Это больше всего относится к Dynamo: всякий раз, когда вы можете, используйте Hash + Range Key. Но вы также можете создавать ключи с помощью Hash и применять некоторые запросы, например:

  • Перечислите все мои записи в таблице T, которая начинается с accountid:
  • Перечислите все мои записи в таблице T, которая начинается с accountid:image

Однако это вообще сканы. Имейте это в виду.

(См. Обзор: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_Scan.html)

Бонус трек

Если вы используете Java, облачные данные в Maven Central включают SimpleJPA с некоторыми расширениями для сопоставления полей больших двоичных объектов с S3. Так что взгляните:

http://bitbucket.org/ingenieux/cloudy

Спасибо

person Community    schedule 11.01.2013