Пригодность AWS Cognito Identity ID для первичного ключа SQL

avatar
OhNoNotALinkerError
8 апреля 2018 в 08:19
1178
2
4

Я работаю над платформой, где уникальные идентификаторы пользователей являются идентификаторами из пула идентификаторов Amazon Cognito. Которые выглядят так: "us-east-1:128d0a74-c82f-4553-916d-90053e4a8b0f"

Платформа имеет базу данных MySQL с таблицей элементов, которые могут просматривать пользователи. Мне нужно добавить таблицу избранного, которая содержит все избранные элементы каждого пользователя. Эта таблица может вырасти до миллионов строк.

Схема таблицы "Избранное" будет выглядеть следующим образом:

userID, itemID, dateAdded

где userID и itemID вместе составляют составной первичный ключ.

Насколько я понимаю, этот тип идентификатора пользователя (практически расширенный UUID, который необходимо хранить в виде char или varchar) дает низкую производительность индексирования. Поэтому не рекомендуется использовать его в качестве ключа или индекса для миллионов строк.

Мой вопрос: Правильно ли я понимаю, и должен ли я беспокоиться о производительности позже из-за этого ключа? Какие меры я могу принять, чтобы снизить риски производительности?

Мои общие знания баз данных не так уж велики, поэтому, если это большая проблема... Я бы переместил список избранного в таблицу NoSQL (где идентификатор пользователя в качестве ключа обеспечивает постоянное время доступа) и извлечение массива идентификаторов избранных элементов для использования в запросе SELECT...WHERE IN, может быть приемлемой альтернативой?

Большое спасибо!

Источник

Ответы (2)

avatar
o-0
13 апреля 2018 в 06:16
4

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

Почему бы и нет: это не очень хорошая архитектура, потому что, если что-то случится с вашим пулом пользователей Cognito, вы не сможете повторно заполнить его одинаковыми идентификаторами для каждого отдельного пользователя. Более того, Cognito теперь предлагается в большем количестве регионов; сравнить с прошлым годом. Предположим, что база ваших пользователей находится в Индонезии, и теперь Cognito доступен в Сингапуре; вы хотите переместить пулы пользователей из Токио в Сингапур; из-за проблемы с задержкой; не только у вас есть проблема с перемещением пользователей; у вас есть проблема с заполнением вашей базы данных; Так что ваш подход не хватает масштабируемости , Вернуемость И разбивает Снежная ответственность (Обновление Cognito требовало вас обновить DB и VICA Versa).

Альтернативное решение: оставьте индекс db для домена db; и используйте имя пользователя в качестве ссылки между вашей базой данных и вашим пулом пользователей Cognito. Итак:

Чтение рабочий процесс будет следующим:

  1. Аутентификация пользователя: Пользователь проходит аутентификацию и получает токен.

  2. Ваше приложение проверяет токен и из его полезной нагрузки получает имя пользователя.

  3. Приложение связывается с базой данных и получает информацию о пользователе на основе имени пользователя.

  4. Ваше приложение приведет пользователя на свою страницу и предоставит информацию, хранящуюся в базе данных.

Запись рабочий процесс будет следующим:

  1. Ваше приложение получает запрос на запись от пользователя с токеном.

  2. проверяет токен.

  3. Запись в базу данных на основе уникального имени пользователя.

8vius
7 января 2019 в 18:08
0

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

avatar
Ashan
8 апреля 2018 в 13:11
2

Что касается MySQL, то если вы используете комбинацию UserID и CognitoID для первичного ключа, это негативно влияет на производительность запросов, поэтому не рекомендуется для больших наборов данных.

Однако использование этого или даже UserID для NoSQL DynamoDB более подходит, если у вас нет сложных запросов. Вы также можете усилить безопасность с помощью детального управления доступом AWS DynamoDB, подключающегося к пулам Cognito Identity.