
Terminator
18.12.2018
19:57:19
@yura_v_007 будет жить. Поприветствуем!


Юрий
18.12.2018
19:59:06
Привет! подскажите как сгенерировать уникальный order_id для заказа если в БД более 500 000 заказов?
Заказы хранятся в таблице ORDERS
order_id должен быть в диапазоне от 0 до 99999999 Целым.
Уникальным полем в таблице ORDERS есть order_id. Поле id в таблице ORDERS - это auto_increment
Пример.. пред order_id = 100
если использовать auto_increment для поля order_id то
след order_id будет 101 и клиент если делает часто заказы сможет иметь представление о кол-ве заказов что делает магазин в любой пром. времени.
нужно, чтобы след order_id - было случайным УНИКАЛЬНЫМ ЦЕЛЫМ числом в диапазоне от 1 до 999999 или больше .. даже если в таблице ORDERS будет всего 100 строк то их order_id должны быть случайными и уникалыными.. из диапазона выше.
Пример в таблице 100 строк
order_id = 34553
order_id = 5
order_id = 898797
и т.д. еще 97 строк и все они с УНИКАЛЬНЫМ СЛУЧАЙНЫМ order_id
—---------------------------------—
Мой алгоритм верный или есть более правильный?
order_id должен быть в диапазоне от 0 до 9999999 Целым.
1 взять все order_id из таблицы ORDERS и сохранить массив в $db_orders
2 $tmp_order_id = rand(0, 99999999);
3. in_array($tmp_order_id, $db_orders) - Если в массиве - формируем новый случ $tmp_order_id и выполняем снова проверку на шаге 3.
4 если не в масиве - пишем в БД
Этот алгоритм сработает, если в БД мало order_id а как быть если order_id в БД больше 500 000?


Серёга
18.12.2018
20:04:50


Юрий
18.12.2018
20:06:50

Google

Серёга
18.12.2018
20:07:44
Если так согласен, а отдельно хранить этот хэш возможно жирно
Хотя ничего не жирно uid для клиента генеришь и по нему будешь искать

Юрий
18.12.2018
20:10:45
мне просто нужно вставлять в БД Уникальные order_id которых в БД нету.. а если они там есть - формировать новый

Серёга
18.12.2018
20:13:45
А, что, прикольно, sha1 продиктовал по телефону?

Юрий
18.12.2018
20:14:57
надо просто чтобы клиент диктовал менеджеру ЦИФРЫ.. в диапазоне от 1 до 9999999 .. никаких букв.. НОВАЯ ПОЧТА как то же решила такую задачу..
У новой почты там вообще в номерах по от 12 до 14 цифр!

Серёга
18.12.2018
20:19:25
У новой почты там вообще в номерах по от 12 до 14 цифр!
->
Пример.. пред order_id = 100
если использовать auto_increment для поля order_id то
след order_id будет 101 и клиент если делает часто заказы сможет иметь представление о кол-ве заказов что делает магазин в любой пром. времени.
У тебя один клиент и он часто делает заказы получается?

Юрий
18.12.2018
20:23:51

Серёга
18.12.2018
20:25:14
Блин, ну, удиви клиентов сделай ауто_декремент

Юрий
18.12.2018
20:25:52
Если разбить SQL SELECT order_id на несколько частей при которых может возвращаться массив $result cодерж до 100 000 строк и поочередно проверять in_array($tmp_order_id, $result) - если не найден, отправляем след запрос со смещением и получаем новые данные ... если же найден - формируем новый $tmp_order_id и выполняем заново SQL SELECT order_id

Серёга
18.12.2018
20:39:48

Google

Серёга
18.12.2018
20:40:44
microtime и тот интереснее выглядит))))

dypa
18.12.2018
20:44:40

Серёга
18.12.2018
20:45:12

dypa
18.12.2018
20:45:40

Серёга
18.12.2018
20:46:30

Юрий
18.12.2018
20:46:38

Серёга
18.12.2018
20:47:16

dypa
18.12.2018
20:49:08

Серёга
18.12.2018
20:49:19

Юрий
18.12.2018
20:49:57
microtime точно продумывал? :)
а что мне даст микротайс кроме как времени выполнения запроса.. я и так знаю что нужно обработать большой массиы и это будет не быстро.. вот и ищу самый эффективный способ
это мне на форуме написали.. но я не понимаю как это сделать и что такое захардкоженая константа но при таком случае тоже как менеджер будет искать этот заказ в своей админке..

Pavel
18.12.2018
20:53:06
почему не взять uuid то?

dypa
18.12.2018
20:53:48

Юрий
18.12.2018
20:54:09

dypa
18.12.2018
20:54:26

Pavel
18.12.2018
20:54:49
это просто стандарт на рандомный 16байтный айдишник

Юрий
18.12.2018
20:59:06
т.е. вы предлагаете перед добавлением в БД ордера формировать UUID , потом проверять, есть ли в БД ордер с ранее сформир UUID - если нету - добавляем ордер, если есть - формируем новый UUID и т.д ?
т.е. это как фингерпринт ордера
но тогда все-равно нужно для ордера как-то установить УНИКАЛЬНЫЙ НОМЕР ОРДЕРА.. Который должен быть исключит из цифр которые клиенту легко будет сообщить менеджеру по телефону.. и по которым менеджер найдет этот ордер в своей админке.. я не понимаю, как тогда устанавливать уникальный ORDER_ID.. или я тупой или я что-то не понимаю

Google

dypa
18.12.2018
21:04:20

Юрий
18.12.2018
21:04:48

Pavel
18.12.2018
21:05:34

dypa
18.12.2018
21:05:46

Pavel
18.12.2018
21:06:18

Юрий
18.12.2018
21:06:30
спорно
больше 90% вероятности ошибок при вводе букв и понимании их

dypa
18.12.2018
21:07:07

Юрий
18.12.2018
21:07:33

dypa
18.12.2018
21:08:14
на второй вопрос я так и не услышал ответ

Юрий
18.12.2018
21:12:26
мне надо цифры как уникальный идентификатор ордера который клиент будет говорить по телефону! менеджерам и мне и всем легче говорить цифры.. и их быстрее вводить в поиске.. цифр всего 10 а букв минимум в 2 раза больше!
это должны быть только цифры.. !!!

sergey
18.12.2018
21:13:46
даже в магазинах типа леруа мерлен или максидома просят назвать последние три цифры заказа
и всем все понятно

dypa
18.12.2018
21:16:42

Юрий
18.12.2018
21:19:28

sergey
18.12.2018
21:20:29
там @уева туча цифр и пара букв. Но они никому не нужны на практике
если ты пришел во время за своим заказом, то его находят по последним трем цифрам и может дату спрсоят
если ты пришел не туда или не вовремя, диктуешь весь номер и тебе говрят что не так.

Google

Юрий
18.12.2018
21:25:39

sergey
18.12.2018
21:25:58
и какие проблемы?

Юрий
18.12.2018
21:26:06
короче сейчас задача сводится к тому.. как эту кучу цифр формировать..
это должна быть строка с фиксир ко-вом цифр. 8, к примеру.. и всегда должны формироваться уникальных 8 цифр.. но не 7 или не 1 а 8 как это сделать?

sergey
18.12.2018
21:27:49
сгенери сразу милион или милиард в отдельную таблицу с полями id autoinc, is_used и выбирай where id>rand(придумай сам) and is_used=0
limit1

dypa
18.12.2018
21:28:36
и какие проблемы?
проблема в том, что парень не хочет думать и разбираться с бизнес областью

sergey
18.12.2018
21:29:25
=) classic

Юрий
18.12.2018
21:29:56

Andrey
18.12.2018
21:30:24
Сделай селект с рандомом из чисел за исключением существующих

dypa
18.12.2018
21:30:28
раз так любишь проценты - какова вероятность того, что клиент сделает 2 одновременных заказа с точностью до секунды?
даты и время у нас записываются в виде цифр?

Юрий
18.12.2018
21:33:41
ну так и сделаю!

sergey
18.12.2018
21:34:00
но тогда твои клиенты просекут
чтото
особнно прошареные конкуренты
=)))

Юрий
18.12.2018
21:39:53
echo rand(1000, 9999) . rand(1000, 9999);
echo rand(1000, 9999) . '-'.rand(1000, 9999);
вот так пойдетт

Google

sergey
18.12.2018
21:47:04
гениально

dypa
18.12.2018
21:47:18

sergey
18.12.2018
21:47:19
и это стоило таких рассуждений?
=) Нет, ну в прицнипе для начинающих рассуждать полезно, ничего против не имею
Помню на заре пхпшничества во вермена пхп4 был заказ сгенерить 100к уникальных номеров. На дюрон 700 генерил больше суток примерно таким же методом м добавляя в unique индекс майскуля
хорошо зима была, а так бы сгорел дюрон )

dypa
18.12.2018
21:49:55
особнно прошареные конкуренты
сама по себе дата(номер заказа) не поможет аунтефикации по телефону, придется еще номер телефона знать или пинкод(но вариант так себе)

Юрий
18.12.2018
21:50:57
echo str_pad(mt_rand(1,9999),4,'0',STR_PAD_LEFT).'-'.str_pad(mt_rand(1,9999),4,'0',STR_PAD_LEFT)

sergey
18.12.2018
21:51:04

Юрий
18.12.2018
21:51:05
djn nfr tot kexit
echo str_pad(mt_rand(1,9999),4,'0',STR_PAD_LEFT).'-'.str_pad(mt_rand(1,9999),4,'0',STR_PAD_LEFT)
вот хороший вариант

sergey
18.12.2018
21:51:40
А угадать милисекунду с первого раза, это как угадать пароль админа магазина )

dypa
18.12.2018
21:51:50

sergey
18.12.2018
21:54:07
*если не полагаться на бд
аесли полагаться, то уник поле

dypa
18.12.2018
21:55:25

sergey
18.12.2018
21:55:38
=)))