powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Задача видимости записей
14 сообщений из 14, страница 1 из 1
Задача видимости записей
    #39559535
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В БД есть следующие сущности:

users(id, name, role) - пользователи системы, role=['manager', 'user']
departments(id, name) - отделы пользователей
categories(id, name) - категории работ которые выполняет организация
userdepartments(id, user, department) - список отделов каждого пользователя (один пользователь может состоять в разных отделах)
usercategories(id, user, category) - список разрешенных категорий работ каждого пользователя (один пользователь может выполнять несколько видов работ)

Помогите с проектированием такого функционала:
Каждый пользователь с role="manager" может отвечать за несколько видов работ, состоять в нескольких отделах и просматривать списки пользователей этих отделов.
Соответственно, в общем случае, он должен видеть список всех пользователей, которые состоят в таких же отделах и тех же категорий работ, как и он.

Навскидку, пришло что-то подобное:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
#Получить список пользователей, доступных менеждеру
select distinct 
	users.*
from users

left join usercategories on usercategories.user = users.id
left join userdepartments on userdepartments.user = users.id

where usercategories.category in 
(select category from usercategories where user = &manager_id)
and userdepartments.department in
(select department from userdepartments where user=&manager_id)



На скрине приведен разбор explain

Есть какие замечания, или предложения?
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559713
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eurobaxСоответственно, в общем случае, он должен видеть список всех пользователей, которые состоят в таких же отделах и тех же категорий работ, как и он.

А вы точно хотите ограничить список пользователей???
Обычно задача ограничения доступа применяется к документам "таких же отделов и тех же категорий работ". А пользователей показывают всех, тем более если пользователь переходит из отдела в отдел, что произойдет с его старыми записями?
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559737
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sereginseregin,

С документами как раз все просто. Документ относится к какому-то конкретному подразделению и виду работ, отбор будет простой.

А вот с пользоватлями получается пересечение множеств (пользователь может состоять в нескольких подразделениях и иметь допуск к нескольким видам работ), здесь и напрашивается грамотный подход и оптимизация.
Если взять
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559739
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sereginseregin,

Добавлю насчет перехода Пользователя в другой раздел.
Это повлияет только на видимость этого пользователя для Менеджера.
Т.е. в данном вопросе нам нужно обеспечить, чтобы Менеджер видел только "своих" пользователей. Если пользователь не состоит ни в одном отделе, которые курирует Менеджер, то последний и не должен его видеть.
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559748
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eurobax,

если человека со скиллами танкиста и летчика прикомандировали сразу к двум отделам, это не значит, что он и там и там будет одновременно ездить и летать...

Я к тому, что наверное, должны быть не только сущности "Сотрудник в отделе", но и для каждого экземпляра такой сущности должен быть как минимум один экземпляр "Допуск к Работе". Обычная практика.

Имхо, если нарисовать картинку - с запросами вопросы исчезнут. Что-нибудь такое:
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559749
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дальше - просто: для конкретного Сотрудника выбираем список пар идентификаторов сущностей Отдел и Работа, где этот Сотрудник допущен к работе в качестве менеджера.
И джойним ("по цепочке") юзеров, имеющих допуск к таким работам в этих отделах.

Если схема более проста (т.е. такая, как ты описан в начале) - подправь её, и все. :)
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559774
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если рассматривать не взаимодействие экземпляров сущностей, а самих сущностей, то получится простая ER - диаграмма (стрелка в
М-Д связи показывает в направлении М):
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559798
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен с чччД,
"допуск к работам" близок к usercategories, возможно это одно и тоже. Менеджеру по Вашему описанию нужны не пользователи, а доступные категории работ с указанием возможных исполнителей. Пользователи тут как справочник с ФИО и Отделом (для доп. фильтрации).

Могу ошибаться. По общему описанию задачи не понятно, зачем это нужно менеджеру. Соответственно цель тоже не ясна.
...
Рейтинг: 0 / 0
Задача видимости записей
    #39559801
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sereginseregin... По общему описанию задачи не понятно, зачем это нужно менеджеру.Каждый менеджер должен знать подчиненный личный состав.

"Каждый солдат должен знать свой маневр" - (с).
sereginseregin...Соответственно цель тоже не ясна.Курсовик?
...
Рейтинг: 0 / 0
Задача видимости записей
    #39560227
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример предметной области может быть такой:

Автопарк в Удмуртской республике.

Departments - это нас.пункты:
- Ижевск
- Воткинск
- Сарапул
- Глазов

Categories - виды услуг:
- такси
- пассажирские перевозки (автобусы)
- грузоперевозки Газель
- грузоперевозки Камаз
- спецтехника

Менеджеры (каждый закреплен за городами):
- начальник пассажирских перевозок (такси, автобусы)
- начальник грузоперевозок (Газель, Камаз)
- начальник спецтехники
- начальник доставки пиццы (шутка)

Задачи менеджера (начальника): мониторить все что относится к их сфере работ, в их городах.
А это сотрудники, заказы, расчеты с траспортниками (водителями)

Водители могут привлекаться на определенные виды работ во всех подразделениях, обычно, территориально близких
Например, таксисты - одновременно в Ижевске и Воткинске.
Пассажирские перевозки - по направлениям (Ижевск-Воткинск, Ижевск-Глазов)
Грузоперевозки, Спецтехника - по всей республике


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


Он должен видеть:
- состав только своих водителей
- только свои заказы
- только расчеты по своим водителям
...
Рейтинг: 0 / 0
Задача видимости записей
    #39560475
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eurobaxПример предметной области может быть такой:
....
Допустим, есть начальник Иванов.
Отвечает за Ижевск и Воткинск, по сфере работ грузоперевозки.
Т.е. если заказ поступил в его городах - он курирует эти заказы, привлекает водил и ведет с ними расчеты.
Ему в процессе работы с подчиненным составом не нужны таксисты, не нужна спецтехника,
не нужны водители из Сарапула, хотя все это одна организация.


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

Но опять же вопрос мне кажется некорректен. Ограничивать нужно не список таксистов или их транспорт, а места приписки - а это отдельный документ-сущность в БД зависимая от времени. Если таксист меняет место приписки или тип такси, должна оставаться история, что менеджер мог назначать таксисту данный заказ.
...
Рейтинг: 0 / 0
Задача видимости записей
    #39560629
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sereginseregin,

Место приписки возникает только в самом заказе:
в определенном подразделении на определенный вид работ назначается Водитель.
Сам водитель может подписаться на разные виды работ, и обслуживать несколько подразделений.
Как раз, для этого есть usercategories, userdepartments - определяют сферы работ и место работ, куда водитель готов ездить.


Продолжу конкретику, вот пример отбора заказов для Менеджера, когда он просматривает все заказы за которые отвечает:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT * 
  FROM orders
WHERE
  orders.date >= "2017-11-01"
  AND orders.category IN (select category from usercategories where user= &manager_id)
  AND orders.department IN (select department from userdepartments where user = &manager_id)
...
Рейтинг: 0 / 0
Задача видимости записей
    #39560633
eurobax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сама модель предусматривает следующее:
Водителей (участников) ~ 1000 человек
Менеджеров ~ 20 человек
Подразделений ~ 20
...
Рейтинг: 0 / 0
Задача видимости записей
    #39560878
sereginseregin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eurobaxsereginseregin,
Сам водитель может подписаться на разные виды работ, и обслуживать несколько подразделений.
Как раз, для этого есть usercategories, userdepartments - определяют сферы работ и место работ, куда водитель готов ездить.

ИМХО. Правильней подписку водителя реализовать как документ-договор, в котором в шапке будет период действия и ссылка на место работы, а в табличной части перечень видов работ. Плюс такой документ можно будет расширять дополнительными условиями договора.

В первом SQL менеджер ошибочно получит информацию о водителе, который готов работать в нужном районе, но выполнять нужный вид работ готов только в другом (соседнем) районе.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Задача видимости записей
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]