Forum Webscript.Ru
Программирование => PHP => Тема начата: sublimity от 03 Октября 2005, 10:20:41
-
Возник вопрос, в решении которого, я надеюсь, вы мне поможете.
Есть уникальный индентификатор товара. Он состоит из 10-ти символов.
Первые 5 символов будут получаться по определенному правилу. Причем для товаров, принадлежащих одной группе, эти символы будут одинаковыми. Оставшиеся 5 символов (именно символов, т.е. это и буквы и\\или числа) должны быть сгенерированы. Эти символы должны быть уникальными.
Есть таблица с :
ID: bigint(20) unsigned NOT NULL auto_increment
IDText: char(20) NOT NULL
Type: tinyint(4) default \'0\',
Где:
IDText- это то самое поле,
Type- показывает свободна эта запись(0) или используется (1),или (3)-забронированна; т.к. индентификатор товара" может освобождаться и должен быть использован после.
Что вы посоветуете по реализации данной задачи?
Моя идея:
блокировать таблицу на чтение (чтобы параллельно не выполнялось то же самое), получить которые свободны и установить флаг в занято и освободить таблицу, и если таких не найдено получать все, которые есть (а там их может быть очень много), и пытаться на стороне PHP придумать следующий.
-
лично я не понимаю смысла задачи.
смысл в обязательном паддинге до 10 символов
смысл в использовании букв.
смысл вообще в таком идентификаторе
-
смысл вообще в таком идентификаторе
Сам непонимаю :) Но так сложилось исторически, и к сожелению не изменить:(
лично я не понимаю смысла задачи.
смысл в обязательном паддинге до 10 символов
смысл в использовании букв.
Не обходимо генерировать следующую возможную последовательность символов
допустим есть:
MOSAU1111A - занят
MOSAU1111B - свободен
MOSAU1111C - занят
....
MOSAU111ZZ - занят
И надо далее сгенерировать при добавлении "товара": MOSAU11A00
Или найти MOSAU1111B ,т.е. найти свободные или создать новые...
Причем это возможно и паралельно , т.е. надо исключить при генерации возможность создания на два товара одинаковых номеров.
Мой вопрос как это лучше сделать?
-
или я чего-то не понял....или:
SELECT COUNT(*) FROM `table` FROM `field` LIKE ("MOSAU1111?")
-
Только
"SELECT COUNT(*) FROM `table` FROM `field` LIKE ("MOSAU%")"
наверное.
Классная идея :)
-
Спасибо.
Есть еще одна идея:
от Steamroller[PHP Club]:
"
Надо только вот для этих генерируемых пятерок символов держать отдельный столбец.
И индекс составной по полям (Type, IDText)
Когда тебе надо создать новый номер, то делаешь так:
лочишь таблицу на запись (а не на чтение).
select idtext2 from table where type=0 order by idtext2 asc limit 1;
получаешь свободный идентификатор с наименьшим номером
Если таких нету -
select idtext2 from table order by idtext2 desc limit 1;
получаешь максимальный номер, дальше в PHP к нему уже единичку добавляешь.
"
-
тяжеловесный запрос получаеться с LIKE
-
А как ты хотел? Придумал идиотскую структуру - любись с ней.
-
hanslinger
Структуру не я придумал !!!
Об этом я уже писал...
Этой структурой пользуються 5 лет....
И в нее надо вклиниться, да так чтобы это было быстро и компактно...
Потому что после получения номера надо будет посылать запрос на заграничные кластер, и бронировать там этот номер, причем эту таблицу надо постоянно синхронизировать с загран.кластером причем на кластере IBM по протоколу 3270.....