Avatar billede neoman Novice
19. oktober 2007 - 19:10 Der er 21 kommentarer og
2 løsninger

Design for fladt hierarki

Jeg har et lille puslespil af data og søger lidt indspark. Udgangspuktet er en medlemsliste, hvor medlemmerne er grupperet i afdelinger:

Members
-------
MemberID (PK)
MemberName
DepartmentID (FK)


Departments
-----------
DepartmentID (PK)
DepartmentName

Hver afdeling har en Manager. Nu gælder det at gemme information om, hvilken manager er et givet medlems manager. En Manager har flere rettigheder i systemet end medlemmer af manageren's egen afdeling.

Hvad er den bedste metode til at gemme den info ?

1. Tabellen Departments kunne i princippet indeholde en FK som peger på en Manager i Members

2. Rollen som manager kan defineres/tilskrives i en hel anden tabel, som indeholder diverse roller for alle medlemmer.

3. Tabellen Members kunne indeholde et felt ReportsTo (FK - joinet på sig selv). Dette tillader flere end et niveau uden problemer (men dette er ikke et krav på nogen måde).

Nogle tanker/erfaringer med fordele/ulemper og gode råd omkring ovenstående ? Jeg søger sipelthen et reality check.
Avatar billede erikjacobsen Ekspert
19. oktober 2007 - 19:22 #1
Man kan diskutere den løsning til repræsentation af et hierarki, hvor een streng (eet felt) repræsenterer vejen fra toppen til en knude i hiearkiet. Fx.  "1-5-88" - topchefen er nummer 1, afdelingsdirektøren nummer 5, og 88 er den umiddelbare manager. Det giver nogle fordele i søgning, men overtræder første normal form. Er det et ikke for dybt hierarki, er det jo ikke nogen stor overtrædelse ;)
Avatar billede arne_v Ekspert
19. oktober 2007 - 19:26 #2
#1 er den nemmeste rent query maessigt, men ogsaa den mest ufleksible fordi den netop
forudsaetter en flad struktur.

#3 giver fleksibiliteten og er ogsaa set mange gange. Queries bliver en lille smule
mere besvaerlige men ikke mere end det kan fixes.

#2 er utilstraekkelig, da den ikke leverer den noedvendige information.

#2 kan dog kombineres med #3 !!
Avatar billede neoman Novice
19. oktober 2007 - 19:32 #3
Der er ikke krav om flere niveauer end et. Mit problem er, at jeg kan finde fordele og ulemper for hver af metoderne, og ønsker udenforståendes indsigt/erfaringer til at kunne træffe et valg som jeg kommer til at hænge på et godt stykke tid.

Jeg har ikke specificeret nogen kriterier at veje løsningens "godhed" op imod: det er for at få alskens indspark:)
Avatar billede nielle Nybegynder
19. oktober 2007 - 19:36 #4
Man skal holde sig for øje at løsningen også skal være dynamisk - tingene ændre sig hen over tid. Den skal derfor kunne tage højde for situationer som:

1) En person/manager forlader organizationen helt.
2) Der kommer en ny person til.
3) En person (måske allerede en manager) forfremmes.
4) En person flytter et andet sted hen i hierarkiet.
5) Der opstår undergrupper inde i en enkelt department (f.eks. sammensættes en midlertidig tæskeforce).

I alle disse tilfælde skal der tages stilling til hvad der skal ske med persopnerne over og under vedkomende. Alt efter hvordan tabelstrukturen og relationerne er strikket sammen er dette mere eller mindre lige til at gøre med et par velvalgte UPDATE's, eller INSERT's (og måske DELETE FROM hvis man alligevel ikke er interesseret i historikken).
Avatar billede arne_v Ekspert
19. oktober 2007 - 19:41 #5
Der er ikke krav om flere niveauer nu, men er du sikker paa at det samme gaelder
om 5 eller 10 aar ?
Avatar billede neoman Novice
19. oktober 2007 - 19:46 #6
Det var nogle gode kommentarer.

nielle> 1/2/3/4 er der taget højde for i alle løsningerne, da enhver ændring i hierarkiet må nødvendigvis føre til en opdatering(CRUD minus R) :) 5. er en interessant tanke somjeg ikke havde tænkt på. Til den slags er det min hensigt at anvende roller i en separat tabel, fordi jeg alligevel er nødt til at have en da en Manager også skal kunne udnævne en eller flere AssistantManagers (=Ass.Manager - som mange ville forkorte det til:) som stedfortrædere i systemet. Dvs det er som arne_V's sidste punkt 19/10-2007 19:26:06
Avatar billede neoman Novice
19. oktober 2007 - 19:48 #7
arne_V : det drejers sig om godkendelse af ferier/timesedler/fravær/vagter og- ændringer  - i princippet skal cheferne også have deres godkendt af en højere magt, men i praksis ?
Avatar billede nielle Nybegynder
19. oktober 2007 - 19:51 #8
Har firmaet ikke allerede alle disse oplysninger i deres AD? Hvorfor ikke bruge dem istedet?
Avatar billede arne_v Ekspert
19. oktober 2007 - 19:51 #9
Hvis firmaet vokser, saa kan du vaere helt sikker paa at under-cheferne skal
have godtkendt den slags af over-cheferne.
Avatar billede neoman Novice
19. oktober 2007 - 19:53 #10
arne_v  & nielle nu får i mig til at tænke lidt, hvis man nu tager den anden dimension på tværs: projekter. Den må jeg lige gruble lidt over)
Avatar billede neoman Novice
19. oktober 2007 - 20:00 #11
nielle>> det er en meget god tanke, og tak for den -  jeg kan desværre ikke besvare den i dette forum.
Avatar billede nielle Nybegynder
19. oktober 2007 - 20:14 #12
Du skal heller ikke besvare den, men det er noget du bør have med i tankerne nå4r du skal anbefale en løsning til din opgavestiler (manager).
Avatar billede neoman Novice
19. oktober 2007 - 22:11 #13
Jeg har taget bidragene til efterretning, skal blot tænke lidt en dag eller to (sove på det etc etc.) inden jeg afslører den løsning, som alle uden tvivl afventer med stor spænding, hvorpå pointuddelingsritualet vil finde sted.
Avatar billede neoman Novice
20. oktober 2007 - 22:31 #14
Nu har jeg kigget på forskellige muligheder og er nået til en lidt anden løsning:

Members skal forblive en flad fil:

Members
-------
MemberID (PK)
MemberName
DepartmentID
..andre Member-data

mens al hierarki gemmes i Departments i stedet for:

Departments
----------
DepartmentID (PK)
DepartmentName
ManagerID(FK fra Members)
evt også AssistantManagerID (FK fra Members)

Hvordan selve hierarkiet skal implementeres (alså info om hvilken afdeling hører under hvilken afdeling)  er ikke klart endnu - enten vha nested sets eller ved erik jacobsens metode. Det med et self-joined felt af typen ReportsTo (eller i dette tilfælde ParentDepartmentID) er pain in the ¤#&, som arne_v nævnte:), fordi det kræver multiple rekursive kald, for at finde alle ancestors eller alle children.

Uanset hvad, så er fordelene ved at lægge hierarkiet andetsteds:

1. Afdelinger og deres relationer ændres overordentligt sjældent, og ved ændringer er der et lille antal records til opdatering
2. En manager ansvarlig for en afdeling behøver ikke at komme fra samme afdeling, og kan optræde som leder for flere forskellige afdelinger(eg. hvor en afdelingsleder også leder nabo-afdelingen, eller hvor divisionschefen også leder en afdeling.)

Den eneste ulempe jeg kan få øje på er, at hver forespørgsel på enten alle overordnede for en Member, eller på alle underordnede for en Manager, nu medfører queries i to tabeller.

to be continued... :)
Avatar billede arne_v Ekspert
20. oktober 2007 - 23:02 #15
Du understøtter stadig ikke chefers chefer.
Avatar billede neoman Novice
20. oktober 2007 - 23:07 #16
Afdelingerne er hierarkiske, således at Dept=31 & Dept=32 hører under Dept 3, og chefen for Dept 3 vil derfor have rettigheder over alle memberID hvor departmentID=31 v 32 og deres ansvarlige chefer (som fundet i Departments tabellen). Hvordan selve hierarkiet skal stores i db'en er jeg ikke helt klar med endnu.
Avatar billede neoman Novice
22. oktober 2007 - 22:12 #17
Okay - jeg får mit hierarki gemt vha Modified Preorder Tree Traversal http://www.sitepoint.com/article/hierarchical-data-database/2, fordi det er så sjældent den ændres, mens den tilgås ret ofte. Rekursive funktioner er noget creepy &/¤# når man debugger, fordi man så får lov til at steppe tilbage gennem hele forløbet ved hver Return;)

Tak for bidragene og alle bedes om at lægge svar.
Avatar billede arne_v Ekspert
23. oktober 2007 - 01:58 #18
Måske kunne du have klaret dig uden rekursion i din applikation med en mere standard tabel struktur !?

Og et svar fra mig.
Avatar billede nielle Nybegynder
23. oktober 2007 - 06:48 #19
Svar :^)
Avatar billede neoman Novice
23. oktober 2007 - 13:23 #20
mangler lige erikjacobsens imprimatur for lukning:)
Avatar billede erikjacobsen Ekspert
23. oktober 2007 - 14:41 #21
Nej tak.
Avatar billede neoman Novice
23. oktober 2007 - 14:53 #22
jeg ved godt du ikke samler på points, men synes ikke man skal lukke før du har været forbi, så dit bidrag også bliver påskønnet:)
Avatar billede nielle Nybegynder
23. oktober 2007 - 17:59 #23
Tak for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester