Ik ben al een tijdje bezig een goed model uit te denken voor een internet veilingsite. Nu heeft iemand mij gewezen op het Materialized Path. Hierbij sla je in de database het pad naar een node op, gerekend vanaf de root (die als pad '1' heeft). Als ik het dus goed begrepen heb, is de volgende tabel daar een voorbeeld van:
Ik heb hierbij een aantal vragen / opmerkingen:
1. stel dat ik nu onder 'zomerfruit' de categorie 'druiven' wil hangen. Druiven zou dan als pad 1.2.1.2 krijgen. Ikzelf zie dat redelijk snel, maar is het niet verschrikkelijk lastig en recursief om een functie te schrijven die dat ook kan?
2. waarom wordt er niet met de id's gewerkt? Bijvoorbeeld:
Dit is exact dezelfde boom. In dit voorbeeld is 'groenten' een absolute top-categorie (dus een root), maar 'fruit' ook. Van daaruit 'bereken' ik het pad naar andere nodes. Ik kan dus in 1 oogopslag zien dat 'aardbeien' (2.5.7) zelf als id (welke auto_increment is) 7 heeft, als parent 'zomerfruit' (2.5) met id 5 heeft, welke weer 'fruit' (2) met id 2 als parent heeft.
Nogmaals mijn vraag: is dit eigenlijk niet makkelijker / logischer?
Een tweede vraag: stel dat ik onder 'zomerfruit' de categorie 'druiven' wil hangen. Stel ook dat ik weet dat ik in het '2.5' pad zit. Als ik nu een INSERT query uitvoer, krijgt de categorie 'druiven' als auto_increment id het cijfer 8 toegewezen. Deze moet toegevoegd worden aan het '2.5' pad. Maar omdat deze id pas NA uitvoer van die INSERT query wordt toegekend, zal ik een nieuwe query moeten uitvoeren om het pas toe te voegen aan deze categorie, of kan het ook in 1 query?
Even wat duidelijker in een stappenplan:
1. ik zit in 'zomerfruit'; neem aan dat er in mijn PHP een variabele ($curr_path) zit die op dat moment de waarde '2.5' heeft
2. ik wil de categorie 'druiven' toevoegen onder 'zomerfruit'
3. mijn PHP voert de volgende query uit: INSERT INTO categories ('id', 'my_path', 'name') VALUES ('', $curr_path, 'druiven')
4. het resultaat hiervan in de tabel is:
5. ik wil echter dat my_path de waarde '2.5.8' krijgt. Omdat die 8 pas wordt toegekend aan de categorie 'druiven' op het moment dat de query wordt uitgevoerd, kan ik niet automatisch die '8' achter het '2.5' pad voegen, of wel?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| +----+-------------------+----------------+ | id | materialized_path | name | +----+-------------------+----------------+ | 1 | 1.1 | Groenten | +----+-------------------+----------------+ | 2 | 1.2 | Fruit | +----+-------------------+----------------+ | 3 | 1.1.1 | Wintergroenten | +----+-------------------+----------------+ | 4 | 1.1.2 | Zomergroenten | +----+-------------------+----------------+ | 5 | 1.2.1 | Zomerfruit | +----+-------------------+----------------+ | 6 | 1.1.1.1 | Witlof | +----+-------------------+----------------+ | 7 | 1.2.1.1 | Aardbeien | +----+-------------------+----------------+ |
Ik heb hierbij een aantal vragen / opmerkingen:
1. stel dat ik nu onder 'zomerfruit' de categorie 'druiven' wil hangen. Druiven zou dan als pad 1.2.1.2 krijgen. Ikzelf zie dat redelijk snel, maar is het niet verschrikkelijk lastig en recursief om een functie te schrijven die dat ook kan?
2. waarom wordt er niet met de id's gewerkt? Bijvoorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| +----+-------------------+----------------+ | id | my_path | name | +----+-------------------+----------------+ | 1 | 1 | Groenten | +----+-------------------+----------------+ | 2 | 2 | Fruit | +----+-------------------+----------------+ | 3 | 1.3 | Wintergroenten | +----+-------------------+----------------+ | 4 | 1.4 | Zomergroenten | +----+-------------------+----------------+ | 5 | 2.5 | Zomerfruit | +----+-------------------+----------------+ | 6 | 1.3.6 | Witlof | +----+-------------------+----------------+ | 7 | 2.5.7 | Aardbeien | +----+-------------------+----------------+ |
Dit is exact dezelfde boom. In dit voorbeeld is 'groenten' een absolute top-categorie (dus een root), maar 'fruit' ook. Van daaruit 'bereken' ik het pad naar andere nodes. Ik kan dus in 1 oogopslag zien dat 'aardbeien' (2.5.7) zelf als id (welke auto_increment is) 7 heeft, als parent 'zomerfruit' (2.5) met id 5 heeft, welke weer 'fruit' (2) met id 2 als parent heeft.
Nogmaals mijn vraag: is dit eigenlijk niet makkelijker / logischer?
Een tweede vraag: stel dat ik onder 'zomerfruit' de categorie 'druiven' wil hangen. Stel ook dat ik weet dat ik in het '2.5' pad zit. Als ik nu een INSERT query uitvoer, krijgt de categorie 'druiven' als auto_increment id het cijfer 8 toegewezen. Deze moet toegevoegd worden aan het '2.5' pad. Maar omdat deze id pas NA uitvoer van die INSERT query wordt toegekend, zal ik een nieuwe query moeten uitvoeren om het pas toe te voegen aan deze categorie, of kan het ook in 1 query?
Even wat duidelijker in een stappenplan:
1. ik zit in 'zomerfruit'; neem aan dat er in mijn PHP een variabele ($curr_path) zit die op dat moment de waarde '2.5' heeft
2. ik wil de categorie 'druiven' toevoegen onder 'zomerfruit'
3. mijn PHP voert de volgende query uit: INSERT INTO categories ('id', 'my_path', 'name') VALUES ('', $curr_path, 'druiven')
4. het resultaat hiervan in de tabel is:
code:
1
2
3
4
5
| +----+-------------------+----------------+ | id | my_path | name | +----+-------------------+----------------+ | 8 | 2.5 | Druiven | +----+-------------------+----------------+ |
5. ik wil echter dat my_path de waarde '2.5.8' krijgt. Omdat die 8 pas wordt toegekend aan de categorie 'druiven' op het moment dat de query wordt uitgevoerd, kan ik niet automatisch die '8' achter het '2.5' pad voegen, of wel?
[ Voor 42% gewijzigd door Reveller op 22-01-2004 23:39 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."