Организационная схема представлена ​​в виде таблицы

У меня есть приложение Access, в котором есть таблица сотрудников. Сотрудники являются частью нескольких различных уровней в организации. В организации 1 ГМ, 5 заведующих отделами, при каждом начальнике отдела несколько начальников, а под этими начальниками рабочие.

В зависимости от должности сотрудника, они будут иметь доступ только к записям тех, кто находится под ними.

Я хотел представить организацию в виде таблицы с какой-то системой уровней. Проблема, которую я увидел, заключалась в том, что есть много людей на одном уровне (например, супервайзеры), но у них не должно быть доступа к записям супервайзера в другом отделе. Как мне подойти к этой проблеме?


person zohair    schedule 06.11.2009    source источник
comment
Почему бы вам не изложить подходы, которые вы рассматриваете, которые, скорее всего, приведут к большему количеству ответов и перенесут вопрос в область программирования (что, как я думаю, так и есть, поскольку дизайн схемы является частью дизайна приложения, даже если он не включает в себя никакого фактического обстрела кода).   -  person David-W-Fenton    schedule 07.11.2009


Ответы (1)


Один из распространенных способов хранения такого рода иерархических данных в базе данных использует только одну таблицу с примерно такими полями:

  1. идентификатор пользователя (первичный ключ)
  2. имя пользователя
  3. supervisorId (самореферентный «внешний ключ», относится к другому идентификатору пользователя в этой же таблице)
  4. positionCode (может быть простым, например 1=lakey, 2=supervisor или внешний ключ, указывающий на другую таблицу позиций и т. д.)
  5. ...все, что вам нужно хранить для каждого сотрудника...

Затем ваше приложение использует SQL-запросы для определения разрешений. Чтобы определить сотрудников, которых разрешено видеть руководителю «X» (чей userId равен «3», например), вы запрашиваете всех сотрудников, у которых supervisorId = 3.

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

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

Я помещаю positionCode в этот пример на случай, если вы хотите, чтобы у некоторых людей были разные разрешения... например, у вас может быть код «99» для сотрудников отдела кадров, которые имеют право просматривать список всех сотрудников.


Может быть, я позволю другим людям объяснить это лучше...

person ewall    schedule 07.11.2009
comment
Не могли бы вы немного помочь мне с SQL-запросом? Как вы думаете, что-то вроде этого будет работать? SELECT * FROM tblemployee WHERE userId IN (SELECT userId FROM tblemployee WHERE SupervisorId=3) - person zohair; 09.11.2009
comment
Не уверен, что вы собираетесь делать с двухэтажным запросом. Чтобы получить всех сотрудников, которые подчиняются супервизору, чей userId равен 3, вам нужно только SELECT * FROM tblemployee WHERE SupervisorId=3. - person ewall; 09.11.2009
comment
Если вы пытаетесь подчинить всех сотрудников высокопоставленному менеджеру... Я не верю, что MS Access может выполнять настоящие рекурсивные запросы в SQL; но вы можете использовать код VBA, который я не могу вам здесь расписать. Но идея такова: создайте функцию под названием GetAllReports, дайте ей идентификатор супервизора, которого вы хотите проверить, и сделайте следующее: (1) запросите все идентификаторы, где их супервизор — это идентификатор, который вы ему дали, (2) для каждого найденного идентификатора снова запустите себя для этого идентификатора и сохраните результаты, и (3) верните все идентификаторы, собранные из исходного запроса и каждый раз, когда он запускал GetAllReports. - person ewall; 09.11.2009