Организационная структура, представленная в таблице
-
18-09-2019 - |
Вопрос
У меня есть приложение Access, в котором есть таблица сотрудников.Сотрудники относятся к нескольким различным уровням в организации.В организации 1 генеральный директор, 5 руководителей отделов, при этом под началом каждого начальника отдела находится несколько руководителей, а под началом этих руководителей находятся рабочие.
В зависимости от должности сотрудника он будет иметь доступ только к записям тех, кто находится под ним.
Я хотел представить организацию в таблице с какой-то системой уровней.Проблема, которую я увидел в этом, заключалась в том, что на одном уровне находится много людей (например, руководителей), но у них не должно быть доступа к записям руководителя в другом отделе.Как мне подойти к этой проблеме?
Решение
Один из распространенных способов хранения такого рода иерархических данных в базе данных использует только одну таблицу с примерно такими полями:
- идентификатор пользователя (первичный ключ)
- имя пользователя
- SupervisorId (самоссылающийся «внешний ключ», относится к другому идентификатору пользователя в этой же таблице)
- код позиции (может быть простым, например 1=лейки, 2=супервизор;или внешний ключ, указывающий на другую таблицу позиций и т. д.)
- ...все, что вам еще нужно хранить для каждого сотрудника...
Затем ваше приложение использует SQL-запросы для определения разрешений.Чтобы определить сотрудников, которых разрешено видеть руководителю «X» (например, чей идентификатор пользователя равен «3»), вы запрашиваете всех сотрудников, у которых SupervisorId = 3.
Если вы хотите, чтобы вышестоящие начальники могли видеть всех, кто находится под ними, самый простой способ — просто выполнить рекурсивный поиск.Т.е.запрос для всех, кто подчиняется этому большому боссу, и для каждого из них, кто ему подчиняется, на всем протяжении дерева.
Имеет ли это смысл?Вы позволяете базе данных выполнять работу по сортировке всех пользователей, потому что компьютеры хороши в таких вещах.
В этом примере я поместил код позиции на тот случай, если вы хотите, чтобы у некоторых людей были разные разрешения...например, у вас может быть код «99» для сотрудников отдела кадров, которые имеют право просматривать список всех сотрудников.
Возможно, я позволю другим людям попытаться объяснить это лучше...
- Вот статья из кулинарной книги Microsoft Access, которая довольно хорошо объясняет эти запросы.
- И вот несколько краткое объяснение того же самого.
- Вот совершенно другой метод («модель списка смежности»), который может оказаться вам полезным, и его объяснение довольно хорошее. Он также указывает на некоторые трудности обоих методов (когда говорит о «денормализации» таблиц).