@Sergo94Min
Разработчик

Какая лучше практика для создания уникального числа и запись его в таблицу, с проверкой на уникальность в этой же Таблице?

Допустим есть таблица где хранятся пин коды для пользователей
Например пришла пачка сущностей пользователей их 1000 штук.
Я так понимаю что в цикле мы проверяем, если у юзер нет пин кода, то нужно ему добавить уникальный которого еще нет в таблице с кодами, типа такого:
if (!$user->pin) {
// тут сделать проверку и запись
}

Я делаю проверку через do while
Типа генерировать уникальное число до тех пор пока в таблице "PinCodes" его не будет
Но получается в цикле 1000 пользователей я огромное количество раз стучусь в базу, а если в базе будет тысячи пин кодов?
Получается один пользователь может при генерации нового пин кода стучатся десятки раз в базу в do while
Как логично сделать с минимальными запросами?
  • Вопрос задан
  • 151 просмотр
Решения вопроса 3
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Во первых - что у вас называется пином? текст, число, какая длина и в каком формате хранится и для чего используется? Насколько это "секьюрная персональная информация"?

интеджер от 5 до 7 символов
В идеале, если это пин, он должен содержать какое-то определенное количество символов. Это удобно по многим причинам.

1 вариант - настроить таблицу на автоинкремент от какого-то пятизначного числа, сделать шаг автоинкремента отличным от единицы и использовать его в качестве пина. Минусы очевидны - привязка к ид, предсказуемость, пляшущая размерность. Плюсы - гарантированная уникальность.

2 вариант - генерация "налету", например через микротайм, или ранд, не суть. В таком случае конечно же не нужно делать проверку через do while, достаточно сделать селект со сгенерированным значением, если запрос вернул строку - перегенерировать, если вернул пустой результат - можно добавлять. В любом случае поле нужно сделать уникальным, дабы избежать повторений.
Ответ написан
serginhold
@serginhold
Возможно тебе это вообще не нужно, если это какая-нибудь авторизация: юзер + пин. В таком случае нет смысла в полной уникальности и уникальный ключ идет на два поля.

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

Если по быстрому на коленке, и только цифры, в php можно сделать что-то типа такого: hexdec(uniqid())
Ответ написан
DevMan
@DevMan
вы изобретаете дикий костыль: нет необходимости в уникальном пине.
сам по себе пин - бесполезен. он используется с другими данными, которые в совокупности дадут уникальную комбинацию.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽