Как уникально хранить идентификатор регистрации GCM в MySQL

Я настраиваю серверную часть механизма Google Cloud Messaging, используя MySQL для хранения идентификаторов регистрации, предоставляемых мобильным приложением. Предоставляя Google возможность выдавать до 4 тыс. Регистрационных идентификаторов, я вынужден хранить их в поле ТЕКСТ. Все до сих пор, проблема в том, что мне приходится обрабатывать такие ситуации:

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

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

Возможные решения, о которых я мог подумать:

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

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

Ответ 1

  • Для хранения самого идентификатора регистрации лучше использовать столбец VARBINARY (4096). Он более эффективен, чем TEXT, если вы кодируете идентификатор регистрации с эффективным набором символов (например, UTF-8).

  • Для эффективного поиска вы все равно должны иметь дополнительный индексный столбец хеширования (BINARY (32)) - мы используем алгоритм дайджеста SHA-256, чтобы получить 32-байтовый хэш из идентификатора регистрации. Столбец хэш не должен быть уникальным. Столкновения должны быть очень редкими, и даже если они произойдут, ваш запрос даст вам небольшое количество идентификаторов регистрации, которые разделяют один и тот же хеш, поэтому это не повредит производительности для тестирования в вашем Java-коде, который один из них (если есть) фактически соответствует идентификатору регистрации, который вы ищете.

  • Если вы решите сохранить уникальный идентификатор устройства и выполнить поиск на нем, я предлагаю вам назначить свой собственный идентификатор для каждого устройства. Этот идентификатор может быть (например) BIGINT (длинный в java). Вы можете потребовать, чтобы приложение вызывало ваш сервер для получения уникального идентификатора при его первом запуске. Вы можете сохранить его на внешнем хранилище устройства, чтобы устройство, в котором приложение было удалено, а затем повторно установлено, будет по-прежнему иметь тот же идентификатор.