Как создать случайные идентификаторы пользователей без повторов в MySQL? - PullRequest
0 голосов
/ 25 января 2019

Я ищу некоторое представление об эффективности и простоте реализации с определенной целью, которую я имею.У меня есть таблица MySQL, хранящая информацию о пользователе.При создании учетной записи им необходимо получить собственный уникальный случайный 5-значный код из 00000-99999.

Вот стратегии, которые я рассматриваю.Некоторые из них кажутся трудными (для начинающего, как я), поэтому я просто хочу обратиться за советом к Stack Overflow.

  • Заполните столбец company_id всеми 5-значными кодами от 00000-99999 вслучайный порядок.Это то, что я сделал до сих пор.Моя проблема в том, что когда кто-то создает учетную запись, мне нужно будет запросить базу данных, чтобы найти первую открытую строку и получить 5-значный код, связанный с ней.До сих пор я не смог понять эту часть.
  • Заполните столбец company_id всеми 5-значными кодами от 00000-99999 в числовом порядке.Когда кто-то создает учетную запись, я выбираю случайную строку open и беру 5-значный код, связанный с ней.Проблема здесь заключается в выборе случайной строки, которая открыта.Опять же, я не знаю, как мне этого добиться.
  • Создайте 5-значный код, когда пользователь создает новую учетную запись, и создайте новую строку в моем user_data с этим 5-значным кодом в качестве company_idколонка.Проблема в том, что программа, в которой создается новая учетная запись, должна иметь доступ к списку 5-значных кодов, которые еще не используются .Я думаю, что это может быть лучшим вариантом, создав массив из 5-значных кодов 00000-99999, заполнив массив всеми используемыми в настоящее время 5-значными кодами из столбца company_id, удалив все элементы в первом массиве, которые соответствуют элементам ввторой, а затем выбор случайного 5-значного кода из измененного первого массива.

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

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Самое простое решение было бы определить company_id как автоматически увеличивающийся столбец идентификатора:

create table USER_DATA (
  company_id int not null auto_increment,
  .... other columns here
  primary key (company_id)
);

Это чрезвычайно эффективно, что, кажется, имеет значение для вас.Более того, это стандартный подход для генерации серии гарантированных уникальных чисел, которая в долгосрочной перспективе облегчит жизнь всем.True company_id монотонно увеличивается, а не назначается случайным образом, но в чем именно преимущество случайных идентификаторов?Буквально никого не волнует, является ли идентификатор случайным числом.

0 голосов
/ 26 января 2019

Постройте таблицу с номерами в случайном порядке.(Если это сложно, я объясню.)

BEGIN;
SELECT number FROM tbl LIMIT 1 FOR UPDATE;
DELETE FROM tbl WHERE number = << the value from the SELECT >>
COMMIT;

Это даст вам «следующий» номер, затем удалите его.Сделка заключается в том, чтобы два соединения не получали один и тот же номер.

0 голосов
/ 25 января 2019

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

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

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

Наилучший подход заключается в переключении подходов по мере заполнения диапазона; при использовании 50% вы, вероятно, найдете пригодное число в течение двух поколений случайных чисел; но в какой-то момент наполненности (когда оставшихся чисел немного) лучше переключиться.

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

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