2009-09-20 1 views
0

В настоящее время я разрабатываю сайт для отеля. И одна из вещей, которые я собираюсь внедрить, - это отношения рабочих и старших. Каков наилучший способ сделать это в MySQL?Вопросы дизайна базы данных

Вот что я имею в виду: начальник шеф-повара - шеф-повар, начальник шеф-повара - начальник смены, начальник сменщика - генеральный менеджер. В таблице сотрудников я мог бы сделать поле превосходным с идентификатором высшего сотрудника, но тогда я могу получить только одну высшую/верхнюю роль; что более важно, я не смог бы получить список всех сотрудников, которых управляет менеджер в конкретном отеле.

Надеюсь, это достаточно ясно, на что мне нужен совет .. спасибо за ваши усилия.

+0

Вы хотите, чтобы у сотрудника было несколько боссов? – elviejo79

+0

Извините, что забыл упомянуть, что у одного сотрудника может быть не более 1-го уровня, поэтому более важно иметь иерархию сверху вниз, пока генеральный менеджер может просматривать данные всех сотрудников. В отличие от менеджера смены, который способен просматривать данные всех сотрудников, но не способен просматривать данные других менеджеров смены. – ant

ответ

1

Ну, с помощью простого графа смежности (supervisor_id указывая на emplo yees table), вы, безусловно, могли бы делать то, что хотите, но оно не будет очень эффективным и не будет масштабироваться для большого количества людей.

Возможно, вы захотите реализовать nested set model. Это позволяет вам очень легко захватывать всех, кто сообщает произвольному человеку в организации.

Если вы достаточно рано в разработке, вы можете подумать о системе Doctrine ORM, которая обеспечивает поведение вложенного набора для моделей, поэтому вам не нужно реализовывать свои собственные.

Edit: Ричард Knop имеет пост о nested sets with php example code, который вы могли бы найти более полезным, чем 100% -SQL примеров Celko .. В

+0

Мне нравится ваш ответ, теперь я собираюсь кое-что прочитать .. и, надеюсь, все будет так, как они должны быть: D tnx – ant

+0

У меня вопрос относительно этой статьи http://www.intelligententerprise.com/001020/celko.jhtml;jsessionid=CQYCHUUILHLFRQE1GHRSKH4ATMY32JVN как вставлять данные в базу данных, вставляя их вручную, создавая форму PHP, чтобы сделать это, как с их вычислением: у этого есть некоторые предсказуемые результаты, которые мы можем использовать для построения запросов. Корень всегда имеет вид (left = 1, right = 2 * (SELECT COUNT (*) FROM TreeTable)); листовые узлы всегда имеют (левый + 1 = правый); предикат МЕЖДУЕТ определяет поддеревья; и так далее. – ant

+0

Не уверен, что именно вы спрашиваете, но, надеюсь, ссылка, которую я только что добавил к моему ответу, поможет вам прояснить ситуацию. – timdev

0

Вы можете получить список всех сотрудников менеджер управляет, делая это на ваших закладках:

SELECT * FROM employees WHERE `superior`='id goes here' 

Но если вы или бой сделать больше, чем один выше просто сделать новую таблицу со столбцами, как это

superior, person 

или если вы хотите, чтобы показать, как дерево, просто сделать это в цикле запросов

+0

Извините, что я забыл упомянуть, что у одного сотрудника может быть не более 1 начальника, поэтому более важно иметь иерархию сверху вниз, пока генеральный менеджер может просматривать данные всех сотрудников. В отличие от менеджера смены, который способен просматривать данные всех сотрудников, но не способен просматривать данные других менеджеров смены. – ant

+0

хорошо, это легко, потому что тогда вам просто нравится первый запрос выше – kennyisaheadbanger

0

Может быть, вы бы лучше создать дополнительную таблицу или список с ролей/функций и назначения уровней для каждой функции, поэтому уровень 4 будет прямым боссом уровня 3 и т. д.

0

Я предлагаю модель вложенного набора. Однако он сказал, что только 1 человек может иметь 1 менеджера непосредственно над ними ...

Я написал блог об этом пару лет назад. ОК его в MSSQL, но он должен преобразовать в MySQL нормально.

Link here

Это показывает, как вставить/перемещения/извлечения полных списков и т.д.

-2

Вы можете сделать это с тремя полями, с «ID» и ряд «управляемых идентификаторов» (два значения). Эти идентификаторы не основаны ни на чем реальном, они просто описывают иерархию.

Затем, чтобы найти всех управляемых сотрудников, вы выбираете каждый идентификатор в диапазоне «управляемых идентификаторов» менеджера. Диапазон идентификаторов топ-менеджеров охватывает всех, менеджеры под ним покрывают меньший диапазон и т. Д., Вплоть до людей, которые никого не управляют и имеют диапазон, содержащий только себя.

Одна из проблем с этим дизайном заключается в том, что когда вы перетасовываете людей вокруг или добавляете новых людей, вам иногда приходится перенумеровать всех, чтобы сохранить иерархию прямо. Если вы используете хороший большой интервал идентификаторов для этого, вам не нужно слишком часто перенумеровать все это. Или вы можете использовать поля с плавающей запятой.

Редактировать: прочитав другие ответы, я заметил, что это вложенная модель набора или ее вариант.

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^