Imaš više načina da skladištiš folder strukturu u bazi. Najjednostavnija za tovarenje je:
FolderID int identity
ParentID int (autoreference na FolderID)
FolderName nvarchar(xxx)
gde ćeš root folder da ubaciš kao parent samom sebi. Strutkura je veoma efikasna, lako se širi i po horizontali i vertikali i omogućava neke komplikovane akcije kao što je MOVE celog stabla nekog foldera sa jednog mesta na drugo. Ovaj sistem je zapravo preslikan realni file-sistem.
Problem sa ovom strukturom je selektovanje određene vrste podataka, npr. "daj mi sve foldere 3 nivoa", "daj mi punu putanju svih krajnjih foldera"
Struktura je rekurzivna pa joj SELECT ne leži baš najbolje. Problem je i multi-level parenting, tj. ako je folder A ćaća B-u a B ćaća C-u i ti sa update uradiš MOVE tako da C postane ćale od B, B i C će pokazivati jedan na drugog a niko neće pokazivati na njih, tako da će postati siročići, dakle potrebno je i u samom kodu održavati integritet podataka.
Druga alternativa je tabela:
FolderPosition int
FolderName nvarchar(xxx)
root folder nije prisutan (ili mu je position = NULL). Svi folderi prvog nivoa imaju position od 1-9, drugog nivoa od 10-99, trećeg 100-999. Roditeljstvo se uspostavlja stepenom desetke, tj. folderu čiji je position 234, parent je folder 23, a njemu folder 2. Ograničenja po horizontali su očigledna (max 9 foldera u root-u, svaki folder maximalno 10 podfoldera), ali se ovo može proširiti na uštrb vertikalnog ograničenja, tako što ćete parenting raditi po stepenu većem od 10 (recimo hex, 16)
Pošto svaki folder nosi svoju poziciju ne treba rekurzija da bi se odredio nivo određenog foldera i može se lako doći do bilo kog foldera iznad njega. Problem je što nikakav SQL referential integrity ovde ne pomaže, sve mora da se održava u kodu. Inače, ovaj sistem koristi 99% knjigovodstvenog softvera koji sam video kod nas da opiše sintetiku i analitiku (uglavnom se koriste stringovi za position), samo što je kod za održavanje integriteta uglavnom nepostojeći/loš.
U svakom slučaju ovo je jedna od retkih situacija u kojima može da se kaže "reduntantnost je dobra". Po svojoj prirodi ove baze se mnogo više čitaju nego što im se menja sadržaj tako da je ekstra vreme utrošeno da se stvore redundantni podaci i da se softverski održi integritet između tih redundantnih podataka se višestruko isplati u brzini vađenja informacija. Dakle, stavi na papir SVE query-e koje hoćeš da imaš (opisno), onda za svaki izvuci neki metod koji će ti omogućiti brzo izvršavanje i onda sva "skupa" polja ma koliko redundantna bila ubaci u tabelu i napravi dobar kod za insert/update.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić