Nu stiu daca asta e solutia sau nu, dar mi se pare o idee destul de buna.
Este oarecum asemanatoare cu una din ideile prezentate anterior.
Fiecarei persoana din baza de date i se atribuie o valoare in plus care va ajuta la identificarea lantului ierarhic( not.
lantIerarhicValue) .
Pe langa aceasta valoare, pentru a usura operatiunea de inserare este necesar sa retinem pentru fiecare Angajat cine este
- superiorul
- ultimul angajat dinaintea lui care se afla in aceeasi echipa cu el. (not.
previousEmployee )
(ex. A este seful lui B, C si D - pentru C valoarea este B, pentru D valoarea este C)
lantIerarhicValue se determina asa.
Pentru radacina (let's call it CEO), avem o valoare destul de mare X
fiecare subordonat direct primeste o valoare mai mica decat X
ex. Daca CEO are subordonati pe A,B,C,D acestora le dam valori
- A.lantIerarhicValue= 1 * 1/maximumNumberOfDirectSubordinates * X;
- B.lantIerarhicValue= 2 * 1/maximumNumberOfDirectSubordinates * X;
- C.lantIerarhicValue= 3 * 1/maximumNumberOfDirectSubordinates * X;
- D.lantIerarhicValue= 4 * 1/maximumNumberOfDirectSubordinates * x;
Acum pentru a raspunde la interogari de genul:
este A subordonat indirect al lui B putem verifica daca A.
lantIerarhicValue este intre B.
lantIerarhicValue si .B.
previousEmployee.lantIerarhicValue.
Una din problemele care ar putea sa para ar fi sa nu cunoasteam valoarea lui maximumNumberOfDirectSubordinates
Dar putem veni cu o solutie pentru aceasta problema:
Setam maximumNumberOfDirectSubordinates cu o valoare destul de mare. Daca la un anumit moment un sef are mai multi subordonati directi decat aceasta valoare(putem sa o dublam), crestem valoarea si actualizam intreg arborele.