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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Номера записей в таблице без пропусков

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Deonis
Отправлено: 12 Января, 2014 - 13:17:03
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




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

(Отредактировано автором: 13 Января, 2014 - 09:54:00)

 
 Top
DelphinPRO
Отправлено: 12 Января, 2014 - 21:05:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




Deonis пишет:
найти оптимальный выход

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

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


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Мелкий Супермодератор
Отправлено: 12 Января, 2014 - 21:31:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Поинтересуйтесь у заказчика, каково должно быть поведение системы, если есть непрерывные заказы 1..10 и надо удалить заказ #4. Пересчитать номера? А если потом позвонил клиент и говорит "у меня заказ номер 7", то какой заказ надо смотреть?

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

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


-----
PostgreSQL DBA
 
 Top
Deonis
Отправлено: 13 Января, 2014 - 09:53:07
Post Id



Посетитель


Покинул форум
Сообщений всего: 298
Дата рег-ции: Нояб. 2009  


Помог: 14 раз(а)




Спасибо, господа, за ответы. Решил сконцентрироваться не на поиске решения проблемы, а на сборе убедительных аргументов, чтоб этого не делать. Через пару дней заказчик возвращается и буду с ним бороться. В худшем случае, как посоветовал Мелкий, сделаю поле NULL. Что-то я забыл об этом, а хоть как-то, но облегчит задачку.
 
 Top
Champion Супермодератор
Отправлено: 13 Января, 2014 - 14:39:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Можете и дыры заткнуть, и не менять номера старым заказам. Для этого нужно хранить пулл удаленных заказов и при сохранении нового брать ему айдишку из этого пулла. Правда, часть свежих заказов будут иметь меньшие номера, чем более новые заказы.

Лучше конечно заказчику какие-нибудь дыры заткнуть.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB