Stromová struktura v SQL

13. 9. 2009

V týdnu mi kolega ukázal zajímavou věc, tak se o ní chci podělit. Dejme tomu, že máme hierarchickou strukturu, třeba e-shop, v němž jsou jednotlivé položky řazeny abecedně:

V SQL tabulce to pak bude vypadat asi nějak takhle:

V případě e-shopu jsou dvě věci, které bychom asi tak mohli chtít udělat – vypsat celý strom a vypsat drobečkovou navigaci. Na oboje musíme v SELECTu použít LEFT JOIN a dotaz, kterým bychom dostali kýžený výstup bez jediné chyby, zas tolik lidí nesestaví. Výhodou je, že nám stačí znát ID a Rodiče.

Pak je tu třeba druhá možnost – totiž uvádět v tabulce také úroveň vnoření. Je ovšem otázka, jestli nám to manipulaci s tabulkou usnadní nebo zkomplikuje.

Třetí možností jsou množiny. Pro lepší představu práce s nimi si výše uvedený strom překreslíme do množin:

V tabulce nám pak stačí uvádět levou a pravou mez množiny:

Pokud budete potřebovat vložit nějakou další množinu, tak všem množinám za tou nově vkládanou UPDATEnete (to je slovo...) levou a pravou mez. To sice může být časově náročnější, ale pro běžnou manipulaci by měla být práce s tabulkou rychlejší.

Problém může nastat právě při vkládání nové položky. Po UPDATE sice budou mít všechny položky správnou levou a pravou mez, ale pokud budeme chtít údaje rovnat podle ID, tak už položky nebudou podle abecedy (tedy tak, jak jsme chtěli). Jako menší nevýhodu lze také uvést, že pro práci s tabulkou potřebujete tři údaje – ID nebo název, levou mez a pravou mez.

Jinak s popsané množiny zdají být poměrně elegantním řešením, ale jejich použití by jednoznačně záleželo na požadavcích na manipulaci s tabulkou.

Zajímá vás více? Přečtete si článek Managing Hierarchical Data in MySQL.



Komentáře

  1. Hlavní strana
  2. Blog
  3. 2009 - září
  4. Stromová struktura v SQL