Voor een soort on-line pagina-editor gebruik ik een hierarchische database -structuur (adjacent model). De hierarchie ligt besloten in twee tabellen, node en relation (dat kennen we onderhand wel neem ik aan). node heeft daarnaast een veld 'class', die verwijst naar een andere tabel met daarin de voor die node specifieke gegevens. Je zou dus kunnen zeggen dat het een soort polymorfische boomstructuur is. Het is voor het doel van de pagina-editor misschien niet de meest handige oplossing, maar aangezien deze structuur alomtegenwoordig is in de rest van de webapplicatie waar de pagina-editor een onderdeeltje van is, heb ik deze ook hier gebruikt.
Nu bestaat elke 'page'-node uit een x-aantal 'block'-nodes. De 'block' node bevat o.a informatie over de positionering van zijn child-nodes op de 'page', is ahw een soort 'container'. De child nodes kunnen echter van verschillende classes zijn, 'paragraph', 'image', 'data source' etc.
Nu probeer ik in 1 query alle benodigde informatie uit de database te trekken voor het opmaken van zo'n pagina. Bestaat een pagina slechts uit 'paragraphs' dan valt het nog wel mee:
Maar aangezien een block meerdere typen objecten kan bevatten, kan ik m'n query oneindig uit gaan breiden met JOINS voor elke class. Dus vroeg ik mea f of er niet een mechanisme bestaat waarmee je dynamisch tabelnamen kunt genereren op basis van tussenresulaten. Zoiets als dit (PSEUDOCODE!!!):
Wat ie dus zou moeten doen is alle tabellen joinen die dezelfde naam hebben als het class veld van c-node...
Dit kan vast niet he....
Nu bestaat elke 'page'-node uit een x-aantal 'block'-nodes. De 'block' node bevat o.a informatie over de positionering van zijn child-nodes op de 'page', is ahw een soort 'container'. De child nodes kunnen echter van verschillende classes zijn, 'paragraph', 'image', 'data source' etc.
Nu probeer ik in 1 query alle benodigde informatie uit de database te trekken voor het opmaken van zo'n pagina. Bestaat een pagina slechts uit 'paragraphs' dan valt het nog wel mee:
code:
1
2
3
4
5
6
| SELECT node. * , block.*, paragraph.* FROM relation AS r1, relation AS r2 JOIN node ON node.id = r1.child_id JOIN block ON block.node_id = node.id JOIN paragraph ON paragraph.node_id = r2.child_id AND r2.parent_id = r1.child_id WHERE r1.parent_id = 21 |
Maar aangezien een block meerdere typen objecten kan bevatten, kan ik m'n query oneindig uit gaan breiden met JOINS voor elke class. Dus vroeg ik mea f of er niet een mechanisme bestaat waarmee je dynamisch tabelnamen kunt genereren op basis van tussenresulaten. Zoiets als dit (PSEUDOCODE!!!):
code:
1
2
3
4
5
6
7
| SELECT b-node.*, c-node.*, block.*, child.*
FROM relation AS r1, relation AS r2
JOIN node AS b-node ON b-node.id = r1.child_id
JOIN block ON block.node_id = b-node.id
JOIN node AS c-node ON c-node.id = r2.child_id AND r2.parent_id = r1.child_id
JOIN {c-node.class} AS child ON child.node_id = c-node.id
WHERE r1.parent_id = 21 |
Wat ie dus zou moeten doen is alle tabellen joinen die dezelfde naam hebben als het class veld van c-node...
Dit kan vast niet he....
[ Voor 14% gewijzigd door Genoil op 28-04-2003 16:09 ]