Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Номера записей в таблице без пропусков
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Номера записей в таблице без пропусков

Страниц (1): [1]
 

1. Deonis - 12 Января, 2014 - 13:17:03 - перейти к сообщению
Приветствую всех! Переодически, встречая подобные вопросы, у меня самого "лицо в руки падало", но вот и сам вляпался. Хм Тот кто работал с заказчиками-мозгоё[цензура] меня поймет.
В общем, записи в БД имеют поле: `order_id` (AUTO_INCREMENT, PRIMARY KEY) и поле `order_num` (не уникальное и без автоинкремента). С первым всё понятно - оно исключительно для работы. А вот второе поле - "номер заказа" - может иметь значение "0", если заказ еще не принят в работу и, если уже принят, то порядковый номер. При этом не должно быть пропусков в нумерации, даже если где-нибудь из середины запись будет удалена.
Решения найденные мной, в большинстве случаев, совпадают с найденными в инете. Все они, как и сама задача, позитивных эмоций не вызывают, поэтому решил посоветоваться с сообществом и найти оптимальный выход из дурацкого положения. Основной принцип в найденных решениях: вытащить все номера, проверить на php присутствие "пробелов", если есть, то взять пропущенное число, если нет - то максимальное + 1 и записать в базу. Конечно "ужос, летящий на крыльях ночи", но жопаделать... Хм
2. DelphinPRO - 12 Января, 2014 - 21:05:02 - перейти к сообщению
Deonis пишет:
найти оптимальный выход

Объяснить заказчику, что если заказу присвоен номер, то этот номер навсегда занят в системе, и не стоит его использовать снова. Гораздо лучше сделать поле-признак состояния заказа, в качестве номера использовать ID, и, возможно, добавить время исполнения.

Я конечно понимаю, что не каждого зака можно переубедить, и систему чаще всего нельзя перестроить, поэтому прошу считать мой пост офф-топиком Улыбка
3. Мелкий - 12 Января, 2014 - 21:31:50 - перейти к сообщению
Поинтересуйтесь у заказчика, каково должно быть поведение системы, если есть непрерывные заказы 1..10 и надо удалить заказ #4. Пересчитать номера? А если потом позвонил клиент и говорит "у меня заказ номер 7", то какой заказ надо смотреть?

Касательно заказов вообще странно. Я знаю, что порой делают наоборот - намеренно пропускают числа для сокрытия реального числа заказов у предприятия.

Если почему-то действительно непрерывность требуется - то при удалении заказа только перенумеровывать все следующие далее.
PS: рекомендую order_num сделать null, тогда можно повесить уникальный индекс.
4. Deonis - 13 Января, 2014 - 09:53:07 - перейти к сообщению
Спасибо, господа, за ответы. Решил сконцентрироваться не на поиске решения проблемы, а на сборе убедительных аргументов, чтоб этого не делать. Через пару дней заказчик возвращается и буду с ним бороться. В худшем случае, как посоветовал Мелкий, сделаю поле NULL. Что-то я забыл об этом, а хоть как-то, но облегчит задачку.
5. Champion - 13 Января, 2014 - 14:39:38 - перейти к сообщению
Можете и дыры заткнуть, и не менять номера старым заказам. Для этого нужно хранить пулл удаленных заказов и при сохранении нового брать ему айдишку из этого пулла. Правда, часть свежих заказов будут иметь меньшие номера, чем более новые заказы.

Лучше конечно заказчику какие-нибудь дыры заткнуть.

 

Powered by ExBB FM 1.0 RC1