Телефонный справочник на основе структуры организации.

b1nary

Новичок
Я пытаюсь написать телефонный справочник для большой организации. Понимаю что это очень легко, но мой справочник основан на структуре предприятия, а я к тому же новичок в php. В б.д. созданы две таблицы: отделы и сотрудники. Все имеют автоинкрементарное id. И поле nomer(int) в каждой таблице, с помощью которого я и задаю определённое место в справочнике, как для отделов, так и для сотрудников внутри отдела, в случае вывода всех сотрудников в режиме "структура". Т.е. первым идёт отдел Дирекция nomer=1, затем выводятся все сотрудники с id дирекция, отсортированные по полю nomer в таблице сотрудники, т.е. 1 директор, 2 зам. директора и т.д., а не по фамилиям. Вторым идёт к примеру Коммерческий отдел nomer=2 и все его сутрудники с id этого отдела. Теперь о проблеме, ниже приведена несуществующая таблица для примера.

Есть таблица sotrudniki в бд MySQL
table: sotrudniki
nomer(int) | name(string)
1 | Иванов
2 | Петров
3 | Сидоров
4 | Карпов


Номер каждого сотрудника необходим для сортировки внутри отдела, т.е. первым должен идти директор/начальник, затем его замы и т.д. Допустим я хочу добавить нового сотрудника в существующий отдел, который будет стоять под номером 2, т.е. мне нужно, чтобы в столбце nomer все значения > или = 2 увеличились на 1. Соответственно тоже самое если я удалю сотрудника под номером 2, у всех значений > 2 отнять 1. Поначалу я начал писать скрипт где в цикле php запрашивал всех у кого >= 2, прибавлял 1, клал в базу и запоминал последнее значение, запрашивал у кого = 3 прибавлял 1, клал в базу и т.д.. Я конечно запутался, к тому же код получился с жутким количеством запросов к б.д., что плохо, ведь народу может быть и тысяча. Понял что делаю что-то не так, от малого количества знаний/опыта.

Скажите пожалуйста, если данный алгоритм видится вам нормальным, то возможно ли его выполнить проще, к примеру силами мускула, в духе (запрос из головы) mysql_query ("UPDATE nomer FROM otdel SET nomer+1 WHERE nomer >=2 "); и MySQL сама увеличит все значения на 1. Если вы знаете алгоритм лучше/грамотнее (уверен так и есть), пожалуйста поделитесь.
 

Dovg

Продвинутый новичок
тебе нужен автоинкрементный ключ и отдельное поле "вес"/"индекс сортировки"

У директора будет 100 000, у его замов начиная 100 000. Наличие "дырок" позволит нанимать и увольнять сотрудников не обновляя другие строки.
 

С.

Продвинутый новичок
к тому же код получился с жутким количеством запросов к б.д., что плохо, ведь народу может быть и тысяча.
Ни что? У тебя каждый день толпами новые сотрудники приходят?
 

b1nary

Новичок
Ни что? У тебя каждый день толпами новые сотрудники приходят?
нет конечно, но мне показалось, по неопытности, что тут я не грамотно кодю, разбрасываясь десятками запросов к б.д. т.е. это как приучить ребёнка с детства мыть руки перед едой.
 

WMix

герр M:)ller
Партнер клуба
а может лучше дерево забабахать?

первая цифорка она не о чем, просто чтоб индификатор был, 2я цифорка это подчиненность....

--есть шеф
1 0 шеф
-- правая и левая рука
2 1 правая рука
3 1 левая рука
и тд...
а когда оббежишь дерево, расставишь цифорки....

можно дерево переделать и показывать иначе
1 шеф
1.1 левая рука
1.2 правая
1.1.3 левая рука левой руки

ну или еще любой 3й алгоритм деревьев....
 

С.

Продвинутый новичок
Есть операции, которые ускорять сложно, да и не нужно, поскольку они редкие и некритичные по времени.
 

b1nary

Новичок
Есть операции, которые ускорять сложно, да и не нужно, поскольку они редкие и некритичные по времени.
Т.е. мой алгоритм не то чтобы идеален, но и выдумывать в этом случае что-то другое не нужно, так получается?
 

С.

Продвинутый новичок
Т.е. мой алгоритм не то чтобы идеален, но и выдумывать в этом случае что-то другое не нужно, так получается?
Одна из обязанностей разработчика -- принятие решений при примерно равновесных достоинствах и недостатках. Один вариант требует технический работы при эпизодическом перелопачивании данных, но зато простую "в лоб" картину в данных. Другой более прост технически, но привлекает организационный ресурс, как то инстриктирование обслуживающего персонала, как правильно присваивать коды с "дырами". Тебе решать.
 

b1nary

Новичок
возможно ли его выполнить проще, к примеру силами мускула, в духе (запрос из головы) mysql_query ("UPDATE nomer FROM otdel SET nomer+1 WHERE nomer >=2 "); и MySQL сама увеличит все значения на 1?
Да конечно возможно, отвечаю я сам себе, тут просто синтаксис немного не верный, так правильно: ("UPDATE otdel SET nomer=nomer+1 WHERE nomer>=2")
Спасибо мне.
 
Сверху