[Java/odbms/SQL]Categoriestructuur opslaan en doorzoeken?

Pagina: 1
Acties:

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Topicstarter
Mijn afstudeerproject draait om een vrij complexe categoriestructuur, die potentieel (en hopelijk ;) ) vrij groot kan worden (honderden categoriëen, duizenden documenten). De view hierop zal iig een website zijn, misschien ook ooit nog wel een of andere xml-view.
Aangezien ik nu zo'n beetje met het Objectontwerp moet gaan beginnen wilde ik eerst nog wat ideëen te berde brengen voor ik enorm in de problemen raak met mijn huidige gedachtes erover :o

De categoriestructuur zal meerdere bomen van categoriëen bevatten, waar documenten aan gehangen kunnen worden. Documenten kunnen aan meerdere categoriëen hangen en hoeven ook niet perse aan leaf-categoriëen te zijn gekoppeld.

De eerste gedachte voor een OO-structuur hiervoor is vrij simpel, je neemt een Categorie, geeft die een of andere List met childcategoriëen en een andere List met documenten. Eventueel doe je de omgekeerde mapping er ook nog bij, dus een Categorie geef je een parent en een Document een List met categoriëen waar ie bij hoort.

Maar dan komt het doorzoeken van en het browsen in de structuur.

Bij de presentatie van de boom wil ik alleen die (sub)categoriëen en "filter"categoriëen laten zien die ook daadwerkelijk naar een (pad naar een) document leiden. En uiteraard moet ook maar een bepaald niveau van categoriëen getoond worden, de complete set bomen in een webpagina verwerken lijkt me niet zo handig :)

Of een categorie naar een document zal leiden hangt af van de plek in de boom en de andere categoriebomen af. Ik hoop dat dit plaatje dat wat beter illustreert:
Afbeeldingslocatie: http://arethusa.tweakers.net/~acm/kb/categoriestructuur.png

Als de blauwe categorie geselecteerd is tijdens het browsen, dan zijn de twee linkse documenten bereikbaar en moeten de beide subcategoriëen getoond worden.
Bij een selectie van de oranje categorie is het oranje gebied zichtbaar (vergeet die samenstelling maar even, das alleen maar extra complexiteit die niet zo relevant is).

Zodra de beide "filters" gekozen zijn, is alleen nog het rode document bereikbaar en mag dus uit het blauwe gebied de blauwe categorie en de subcategorie die aan het rode document vastzit getoond worden en uit het oranje gebied alleen de oranje categorie zelf.

De simpele manier om dit in een OO-oplossing te verwerken, lijkt me, is om per selectie een lijst van documenten te maken en daar dan een intersectie van te nemen. Deze klinkt mij alleen totaal niet efficient in de oren, zeker niet als ik dat zelf in Java ga lopen implementeren.

Nu heb ik een test opstelling met php5 en de opslag in (Postgre)SQL, de complexiteit van de selectie van de relevante documenten en categoriëen zit verwerkt in een paar complexe queries met elk de nodige subqueries. Om dat enigszins efficiënt te houden heb ik al gebruik "moeten" maken van een paar hulptechnieken (nested set van Joe Celko, een soort transative closure (welk document is vanaf welke categorie bereikbaar) en dat allebij weer dmv triggers aan de originele structuur gehangen).
Hoewel het werkt, ben ik niet zo weg van de complexiteit van de SQL-statements (meerdere pagina's aan tekst als ik het netjes formatteer) en de structuur is ook niet de allermooiste.

Voor de SQL-oplossing zie ik eigenlijk nauwelijks openingen voor verbeteringen, de recursieve queries zijn al overboord gegooid en de performance is nu al alleen te bereiken door de (redundante) extra tabellen.

Een idee dat ik heb is om de documentrepresentaties in een Xapian-database te stoppen en daar met Xapian-queries in te gaan graven (en dan dus de lijsten als tekstvelden beschouwen en dat soort dingen). Een Xapian DB is eigenlijk één grote B+-tree waar alle identifiers voor documenten (categoriëen, documenttypen, etc) allemaal in verzameld zijn, aangezien ik ook met keywords zal gaan werken en Xapian daar dan weer flink in uitblinkt is dat weer een voordeel. Maar Xapian kent geen hiërarchische structuren en het updaten van documenten is niet bijster handig te regelen daarin, dus dan moet ik voor de categoriëen alsnog een aparte representatie voor gaan geven. Hoewel er dan niet zoveel noodzaak is om dat in een rdms te steken en daar op complexiteit bespaard zou kunnen worden.

Een ander idee is om een Object database te nemen, dat lijkt heel goed met hiërarciëen te werken, maar ik zou dus niet weten hoe dat uitpakt met het nemen van intersecties van documentlijsten.

Iemand die mij tips kan geven en/of een ander idee heeft hoe ik deze structuur kan representeren en schaalbaar kan doorzoeken/browsen?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

De rechtenfunctionaliteit van mijn zelfgemaakte froum werkt op een vergelijkbare manier als deze.
Dit heb ik gedaan middels hierarchische query's (connect by) op een categorietabel.
Verder heb je volgens mij alleen een koppeltabel nodig naar je documenten.
Maar dan heb ik het niet over OO-software.
Waarom zit je in de OO hoek te kijken?

Who is John Galt?


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Topicstarter
justmental schreef op 18 januari 2004 @ 19:49:
Dit heb ik gedaan middels hierarchische query's (connect by) op een categorietabel.
Verder heb je volgens mij alleen een koppeltabel nodig naar je documenten.
Mja, maar een recursieve query op je tabelstructuur lijkt me niet heel fijn, de nested set die ik daarvoor gebruik is iig een stuk lichter, denk ik.
Maar dan heb ik het niet over OO-software.
Waarom zit je in de OO hoek te kijken?
Je bedoelt waarom ik het OO-paradigma gebruik? Of waarom ik naar OO-persistency kijk?

't Eerste is omdat ik daar toch wel het bekendst mee ben, functioneel programmeren heb ik al tijden niet gedaan en procedureel programmeren zie ik geen voordeel in tov OO.
't Tweede, sja, als dat de beste oplossing is, waarom niet? Ik vind het opzich prima als ik uit mijn database een compleet passende tree haal, maar 't moet wel een beetje efficient gebeuren natuurlijk ;)

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Heb je al eens op SQLTeam.com gezocht? Op het forum zijn een aantal zeer intressante discussies geweest over hierarchische structuren in een relationele database. (onder andere 'betere' queries voor het nested set model van Joe Celko)

Persoonlijk zou ik niet direct een OO database kiezen als het wel in een relationele kan en ik nog nooit met een OO db had gewerkt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Topicstarter
P_de_B schreef op 19 januari 2004 @ 09:00:
Heb je al eens op SQLTeam.com gezocht? Op het forum zijn een aantal zeer intressante discussies geweest over hierarchische structuren in een relationele database. (onder andere 'betere' queries voor het nested set model van Joe Celko)
Hmm, ik kan eigenlijk niets vinden?
Althans, niets dat nieuw voor me is en/of niet al in "SQL for Smarties" staat (die ik hier heb liggen)
Persoonlijk zou ik niet direct een OO database kiezen als het wel in een relationele kan en ik nog nooit met een OO db had gewerkt.
Ik ook niet, maar als een paar van de basis-queries (de genen die voor vrijwel elke pagehit uitgevoerd worden iig) al twee a drie pagina's geformatteerd SQL lang zijn, dan ga ik me toch afvragen of het niet beter kan :o
En dan zijn ze nog niet helemaal compleet eigenlijk :/

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
In het boek 'Patterns of Enterprise Application Architecture' van Fowler staan er een aantal patterns die je misschien wel interessant vind (lazy loading, er worden verschillende methoden besproken om een OO inheritance tree in een RDBMS op te slaan, ....)

https://fgheysels.github.io/


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Topicstarter
whoami schreef op 19 januari 2004 @ 11:54:
er worden verschillende methoden besproken om een OO inheritance tree in een RDBMS op te slaan, ....
Ik kon er maar een vinden die werkte met een tree van elementen en daarbij sloeg ie de complete dataset als XML in een blob op :X
Pagina: 1