[MySQL] Opslaan Materialized Path node

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
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:

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."


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Kan iemand mij hiermee op weg helpen?

<span style="color:blue">modbreak: wacht voortaan even 24 uur met het kicken van je topic: niet iedereen is de hele dag aanwezig om jouw specifieke vraag te beantwoorden en je topic staat 24 uur in de actieve lijst :)</span>

ok, was idd bang dat 'ie uit de lijst zou verdwijnen (hij zakte steeds dieper ;)) en wil niet twee keer een vraag posten; dan wordt het al snel spammen :)

[ Voor 99% gewijzigd door Reveller op 23-01-2004 12:48 ]

"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."


  • Skaah
  • Registratie: Juni 2001
  • Niet online
Waarom gebruik je een zo'n ingewikkeld pad en geen Id en parentId? Zo'n pad als je nu hebt is lastig in een database. Je kunt niet even snel de alles selecteren wat onder een item staat... of zie ik dat verkeerd?

Wees niet bang voor recusieve functies trouwens, ze zijn onmisbaar bij dit soort structuren.

Ik gebruik zelf dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
+----+----------+--------------------+
| Id | parentId | title              |
+----+----------+--------------------+
|  1 |        0 | Home               |
|  2 |        1 | Bevers             |
|  3 |        2 | Openen en Sluiten  |
|  4 |        2 | Huize Hotsjietonia |
|  5 |        4 | Lange Doener       |
|  6 |        4 | Pompedomp          |
|  7 |        4 | Hippe Springveer   |
|  8 |        4 | Scheuremaar        |
|  9 |        4 | Lappezak           |
| 10 |        4 | Ssssssst           |
+----+----------+--------------------+

Je tweede vraag: je zou kunnen kijken wat het hoogste Id is in de database, maar daar moet je ook weer een select voor uitvoeren (nl. SELECT max(Id) of SELECT LAST_INSERT_ID()). In één kan niet (voor zover ik weet).

[ Voor 12% gewijzigd door Skaah op 23-01-2004 13:43 ]


  • Sosabowski
  • Registratie: Juni 2003
  • Laatst online: 18-04 11:49

Sosabowski

nerd

of kijk eens of je hier iets mee kan.
Daar wordt ook de manier die Skaah gebruikt genoemd.

The whole problem with the world is that fools and fanatics are always so certain of themselves, and wiser people so full of doubts. -- Bertrand Russell