Вопрос дизайна базы данных - PullRequest
       9

Вопрос дизайна базы данных

0 голосов
/ 20 сентября 2009

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

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

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

Ответы [ 6 ]

1 голос
/ 20 сентября 2009

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

Что вам, вероятно, нужно, это реализовать модель вложенного множества *1004*. Это позволяет очень легко захватить каждого, кто отчитывается перед каким-либо произвольным человеком в организации.

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

Редактировать: У Ричарда Кнопа есть пост о вложенных наборах с примером php кода , который может оказаться более полезным, чем примеры Celko со 100% -ным чтением.

0 голосов
/ 21 сентября 2009

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

0 голосов
/ 20 сентября 2009

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

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

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

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

0 голосов
/ 20 сентября 2009

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

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

Ссылка здесь

Показывает, как вставить / переместить / получить полные списки и т. Д.

0 голосов
/ 20 сентября 2009

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

0 голосов
/ 20 сентября 2009

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

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

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

superior, person

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

...