|
|
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
Добрый вечер. Хотелось бы узнать кто и как из разработчиков решал проблему описанную ниже. Есть база данных Firebird. Условно в ней 3 таблицы. 1. Сотрудники (USERS: ID int, NAME varchar) 2. Подчинения (USERS_TREE: ID int, USER_ID int, MASTER_ID int, FCODE varchar) 3. Данные по сотрудникам (DATA: ID int, USER_ID int, FDATE date, Amount int) В таблице подчинений хранится информация о подчинении сотрудников в предприятии. В таблице DATA содержатся опр.данные по всем сотрудникам. Руководитель должен иметь возможность просматривать эти данные за всех сотрудников, которые ему подчиняются. В то же время у тех сотрудников могут быть свои подчиненные. Как более грамотно построить SQL запрос чтобы можно было выбрать из таблицы DATA данные только по подчиненным. На настоящий момент я ввел поле FCODE тип - строка. Она состоит из макс.60 блоков символов по 4 шт (т.е. 240 символов). Один блок - это один сотрудник. Например: USERS_TREE: (ID, USER_ID, MASTER_ID, FCODE) 1, 1, 0, 0001 2, 2, 0, 0002 3, 3, 2, 0002|0003 (подчиненый для USER_ID=2) 4, 8, 2, 0002|0008 (подчиненый для USER_ID=2) 5, 9, 3, 0002|0003|0009 (подчиненый для USER_ID=3) ... SQL запрос пишется сл.образом: Для сотрудника узнаем его FCODE, допустим 0018, тогда подчиненых и его в т.ч.можно вывести с помощью INNER JOIN от DATA к USERS_TREE при UT.FCODE LIKE '0018%'. Вроде ничо, НО бывает так что люди уходят или переводятся, а у них много подчиненных. Возникает необходимость лазить по базе и менять FCODE для всех его подчиненных. Какие есть альтернативные варианты для такой иерархии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.12.2010, 18:37 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
spandexКакие есть альтернативные варианты для такой иерархии? Ну, до тех пор, пока в FB не появятся рекурсивные запросы, зло неизбежно :) По мне, наиболее нормальный вариант - сделать таблицу-развязку "все прямые и косвенные подчинённые человека" и обновлять её по необходимости. А вообще - поищите книжку по ключевым словам SQL antipatterns, была неплохая вещь, где среди прочего разбирались решения этой задачи и плюсы-минусы каждого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 00:14 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
поиск детей в дереве - стандартная задача, решение зависит от того, что требуется от системы. Если нужен быстрый селект по большим ветвистым деревьям - то можно попробовать метод селко. Если быстрая вставка - то можно и циклами (при отсутствии встроенной поддержки иерархий в субд). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 01:17 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
softwarerspandexКакие есть альтернативные варианты для такой иерархии? Ну, до тех пор, пока в FB не появятся рекурсивные запросы, зло неизбежно :)Они уже давно появились . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 08:52 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
Ваша основная ошибка, spandex, в постановке задачи. Люди, если вам в детстве забыли об этом сказать, равны, никто никому не подчиняется. А вот функциональные или административные роли людей - да, имеют иерархии, это правда. Ваша иерархия называется "штатное расписание". Административная структура лавки - штатное расписание - иерархия должностей. Персона - занимает должность. Возможны изменения двух типов: связанные с реорганизацией лавки или миграцией кадрового состава, что и легко администрируется, и просто укладывается в историю изменений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 09:41 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 10:05 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
Сдается мне что мой способ все такие легче. Но я все равно изучу предложенные вами материалы для следующих работ. Выражаю особую благодарность: Senya_L, Naf и softwarer. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 12:44 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
spandex, Изначально не вчитывался в Вашу задачу, но имхо Вам достаточно одной древовидной таблицы "Сотрудники". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 12:57 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
Хорошо известное, но, к сожалению, не доступное в FB и других РСУБД, решение: здесь два объекта и две связи между ними. Сотрудник(U) {Имя(N),сторока} Данные по сотруднику(D) {Некая дата(FD),дата; Некое количество(A),число} Сотрудник - Имеет подчиненного/Является подчиненным(1) -> Сотрудник Сотрудник - Имеет/Относятся к(1) - Данные по сотруднику Например, для сотрудника id все подчиненные с учетом иерархии: SELECT U{N},D{FD,A} FROM U(1)-U(1)-D WHERE ^U(-1):ID=id а только непосредственно подчиненные: WHERE U(-1):ID=id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 14:43 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
Senya_LИзначально не вчитывался в Вашу задачу, но имхо Вам достаточно одной древовидной таблицы "Сотрудники". Из постановки, действительно, не совсем ясна объективная необходимость Данных по сотруднику. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2010, 14:44 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Т.е. в таблице хранится вот такая иерархия: -1 --11 --12 ---121 --13 Список всех сотрудников, прямо или косвенно подчиненных сотруднику 1: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Список всех начальников сотрудника 121: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Иерархические запросы на Firebird 2.5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2010, 00:21 |
|
||
|
Проектирование и использование иерархий в базах
|
|||
|---|---|---|---|
|
#18+
JohnSparrow, спасибо, то, что надо. Насчет объективной необходимости. Есть штатное расписание и таблица отработанных сотрудниками часов за месяц. Каждый руководитель должен иметь возможность контроля опоздания или уходов сотрудников (за свой отдел/управление/филиал) раньше времени с рабочего места. Также ведется контроль сверхурочных. В автозапуске висит прога, которая регистрирует вкл. и выкл. сис.блока. На основе этих данных расчитывается кол-во отработанных часов. Было требование чтобы руководители одного и того же уровня не могли видеть данные по подчиненым друг друга, а только своих и кто подчинен им и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2010, 11:05 |
|
||
|
|

start [/forum/topic.php?fid=32&gotonew=1&tid=1542390]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
256ms |
get topic data: |
13ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
| others: | 227ms |
| total: | 583ms |

| 0 / 0 |
