650 likes | 784 Views
Stromy a hierarchické struktury v SQL. 30.11.2005 Mária Szabó, Jirka Zouhar, Gergely Jakab. M ária Szabó 30 .11.2005. Using the Node Type to Solve Problems with Hierarchies in DB2 Universal Database. Node Type & Hierarchies in DB2. Z ákladní p ojmy Úvod do problematiky Koncept řešení
E N D
Stromy a hierarchické struktury v SQL 30.11.2005 Mária Szabó, Jirka Zouhar, Gergely Jakab
Mária Szabó 30.11.2005 Using the Node Type to Solve Problems with Hierarchies in DB2 Universal Database
Node Type & Hierarchies in DB2 • Základní pojmy • Úvod do problematiky • Koncept řešení • Node type • Výhody • Příklady
Node Type & Hierarchies in DB2 • Hiearchie • Relační Db • Node Type Pojmy
Node Type & Hierarchies in DB2 • Před 30 lety – hierarchical db • Svázánost se db strukturou • Ukazatel – pointer • Nákladné chyby • Vícenásobné použití pro stejná data Problematika
Node Type & Hierarchies in DB2 • Průměr účetní bilance pro každý region i odvětví • 10 největších klientů • Definovat více hierarchií • Synchronizace dat
Node Type & Hierarchies in DB2 • Pre-processing dat • Myšlenka typu UZEL • Série čísel • Hladina – Level • Indexování jako v SQL Uzel & Hierarchie
Node Type & Hierarchies in DB2 CREATE TABLE employee ( Employee_Id Integer, Manager_Id Integer, Last_Name varchar(30) ... PRIMARY KEY(Employee_Id), FOREIGN KEY (Manager_Id) REFERENCES employee(Employee_Id); Kolik zaměstnanců pracuje pro jistého managera? SELECT COUNT (*) FROM employee emp, employee manager WHERE emp.Manager_Id = manager.Employee_Id AND manager.Last_Name = ‘Roy’; Pro každého zaměstnance zjistit počet podřízených !?!
Node Type & Hierarchies in DB2 • Vícenásobné levely v managmentu • SQL příkaz pro každý manager pro každý level • Víckrát vnořovat Problém CREATE TABLE employee2 ( Employee_Id Node, Last_Name varchar(30), ... PRIMARY KEY(Employee_Id);
Node Type & Hierarchies in DB2 1| |Joe| 2|1|Joe2| . . . 8|2|Joe8| . . . 14|3|Joe14| NULL na místě managera šéf ---------------------------- 1.0|Joe| 1.2|Joe2| . . . 1.2.8|Joe8| . . . 1.3.14|Joe14|
Node Type & Hierarchies in DB2 • Kolik zaměstnanců pracuje pod specifikovaným managerom? • Přímé potomky • Rekurzie dokud jsme neprošli všechny lidi • Rekurzivní dotaz nebo procedura Pro EMPLOYEE table: WITH RPL (employee_Id, Manager_Id, Last_Name) AS (SELECT ROOT.employee_Id, ROOT.Manager_Id, ROOT.Last_Name FROM employee ROOT WHERE ROOT.employee_Id = 1 UNION ALL SELECT CHILD.EMployee_Id, CHILD.Manager_Id, CHILD.Last_Name FORM RPL PARENT, employee CHILD WHERE PARENT.Employee_Id = CHILD.Manager_Id ) SELECT COUNT(*) -1 FROM RPL;
Node Type & Hierarchies in DB2 • Kolik zaměstnanců pracuje pod špecifikovaným mangerom? • uzly, které padají pod spec. managerom Pro EMPLOYEE2 table: 1.3 > 1.2.8 > 1.2 SELECT COUNT(*) FROM Employee2 WHERE Employee_ID > NodeInput(‘1.2’) AND EMPLOYEE_ID < NodeInput(‘1.3’);
Node Type & Hierarchies in DB2 Test • Každý manager 6 přímých potomků • Lidi úplně na spodku nejsou managery • pro 9331 řádků 37 násobné zrychlení • tradiční přístup exponenciální char. • uzlový přístup lineární charakteristika • rozdíl se zvětšuje #levelu
Node Type & Hierarchies in DB2 Implementace typu UZEL - NODE CREATE DISTINCT TYPE Node AS varchar(64) FOR BIT DATA WITH COMPARISONS;
Node Type & Hierarchies in DB2 Indexování a SQL dotazy • indexování typu uzel • umístnit do WHERE klauzuli • možnost i bez indexování scan table SELECT * FROM employee2 WHERE isDescendant(employee_Id, NodeInput(‘1.7.43’)) ORDER BY employee_Id Desc; Příklad vrátí všechny potomky uzlu 1.7.43
Node Type & Hierarchies in DB2 Příklad vrátí všechny potomky uzlu 1.7.43 SELECT * FROM employee2 WHERE employee_Id > NodeInput(‘1.7.43’) AND employee_Id < NodeInput(‘1.7.44’) ORDER BY employee_Id Desc; Příklad vrátí pouze přímé potomky uzlu 1.7.43 SELECT * FROM employee2 WHERE employee_Id > NodeInput(‘1.7.43’) AND employee_Id < NodeInput(‘1.7.44’) AND Length(employee_id) = 4 ORDER BY employee_Id Desc;
Node Type & Hierarchies in DB2 !Občas je zapotřeby přidat funkce pro zachování použitelnosti indexu! SELECT * FROM employee2 WHERE isAncestor(employee_Id, NodeInput(‘1.7.43.256.1537’)) ORDER BY employee_Id Desc; 1.7.43.256 , 1.7.43, 1.7, 1.0 SELECT * FROM Employee2 WHERE Employee_Id IN ( SELECT x.col1 FROM TABLE(Ancestors(NodeInput(‘1.7.43.256.1537’))) AS x ) ORDER BY employee_Id Desc;
Node Type & Hierarchies in DB2 Hlavní výnos • Obrovské tabulky rýchlá odezva • Rozumné dotazy nezávislost na# požadavků
Děkuji Mária Szabó 30.11.2005
Detaily hierarchii v DB2 30.11.2005 Jirka Zouhar
Použití • Ve složitějších případech je třeba oddělit hierarchii od dat • Lze použít i více hierarchií • Příklady: • Skladová evidence zásob • Hierarchické systémy zásad • Klasifikace objektů
Hierarchie zásad • CREATE TABLE Policies ( PolicyNumber Node, Description varchar(50) ); • CREATE TABLE Objects ( Name varchar(50), PolicyNumber Node ); • CREATE TABLE Safe_places ( Location Node, PolicyNumber Node, Description varchar(75), Administrator varchar(30) );
Hierarchie zásad • Jaké objekty mají „malé“ zabezpečení? • Jak zabezpečený je daný objekt? • Mají všechny zóny korektní zabezpečení? • Nejsou objekty v špatných zónách? • SELECT * FROM Objects, Places WHERE Places.policyNumber NOT IN Ancestors(Objects.policyNumber)
Skladová evidence • CREATE TABLE Parts ( PartNumber integer, Name varchar(30), Price money ); • CREATE TABLE Components ( ComponentId Node, Sequence integer, Quantity integer, Name varchar(30), PartNumber integer );
Klasifikace Objektů • CREATE TABLE materials ( • Name varchar(30), • Type Node ); • CREATE TABLE parts ( • Name varchar(30), • Type node, • ComponentId node, • Price integer, • Provider varchar(30), • PartNumber ingeter, • Description integer );
Klasifikace objektů 1 Materiál 1.1 dřevo 1.2 železo 1.3 kůže 1.1.1 mahagon
Klasifikace objektů • Najdi všechny součástky z mahagonu s cenou menší padesáti. • SELECT name,desc,price FROM parts WHERE isDescendant(type, NodeInput( SELECT type FROM materials WHERE name='mahagon')) AND price < 50;
Funkce pro práci s Node Type • Node nodeInput (varchar) Převede varchar na Node Type. • Varchar nodeOutput (node) Převede Node Type na Varchar V dalším bude pro zjednodušení používán místo nodeInput ('1.3.5') zjednodušený zápis 1.3.5
Funkce pro práci s Node Type • Node[] Ancestors (node) Vrátí seznam předků: Ancestors(1.25.3) = {1.25,1} • Integer GetMember (Node, Integer) Vrátí číslo větve na dané úrovni: GetMember(1.3.5.4,2) = 3 • Node getParent (node) Vrátí otce zadaného: getParent(1.5.4) = 1.5
Funkce pro práci s Node Type • Node Increment (node) Vrátí další node v řadě: Incerment (1.2.22) = 1.2.23 • Node Increment (node, integer) Vrátí další node v řadě na dané úrovni: Increment (1.2.22, 2) = 1.3 • Node newLevel (node) Vrátí nový node o úroveň níž: newLevel (1.2) = 1.2.1
Funkce pro práci s Node Type • Integer isAncestor (node1, node2) Testuje, zda je node2 v podstromu node1: isAncestor (1.2, 1.2.3.55) = 1 isAncestor (1.3, 1.2.4) = 0 • Integer isDescendant(node,node) Opak isAncestor: isDescendant (node1, node2) = isAncestor (node2, node1)
Funkce pro práci s Node Type • Integer isChild (node1, node2) Testuje, zda je node2 synem node1: isChild (1.2, 1.2.3) = 1 isChild (1.2, 1.2.3.5) = 0 • Integer isParent (node, node) Opak isChild • Integer length(node) Zjistí úroveň node ve stromu: length (1.2.3.5) = 4
Funkce pro práci s Node Type • Node graft(node,node,node) Přesune větev danou třetím parametrem jako podstrom druhého parametru, první je otec přemísťovaného stromu. UPDATE Parts SET Part_num = Graft( 1.2, 1.5.6, Part_num) WHERE Part_num > 1.2.18 AND Part_num < 1.2.19
Funkce pro práci s Node Type • Graft (1.1.3, 1.4, 1.1.3.2) = 1.4.2 1 1 1.1 1.4 1.1 1.4 1.1.3 1.4.1 1.1.3 1.4.1 1.4.2 1.1.3.2
Zdroje • http://www3.software.ibm.com/ ibmdl/pub/software/dw/dm/db2/0302roy/ 0302roy.pdf • http://www3.software.ibm.com/ ibmdl/pub/software/dw/dm/db2/0302roy/ DB2Node.zip
Hnízděné intervaly 30.11.2005 Gergely Jakab Nested intervals
Obsah • Úvod • Materializovaná cesta • Vnořené množiny • vylepšení • Vnořené intervaly • Základní myšlenka • Mapovaní • Normalizace • Funkce • Příklady: Test struktury
Úvod • tranzitivní závislosti v relační databázi (hierarchické struktury) • 4 dobře známé metody z nichž 2 prozkoumáme • materializovaná cesta • vnořené množiny • Vadim Tropashko vymyslel smíšeninu těchto dvou metod (vnořené intervaly) • implementace a příklady na Oracle
Skok zpátky : materializovaná cesta • každý záznam obsahuje absolutní cestu k uzlu • cesta = čísla uzlů od kořene oddělené separátorem • jistá podobnost k absolutním cestám na UNIXu • kompaktnější verze místo primárního klíče uzlů staví cestu z pořadového čísla uzlu mezi sourozenci
Dotazy u materializované cesty • standardní dotazy s „LIKE“ : • efektivní na podřízené • NEefektivní na nadřízené • chytré dotazování pro nadřízené: • pomoci řetězcové funkce, která vrátí množinu cest všech nadřízených • f('1.2.1.1') = ('1.2.1', '1.2', '1') • …WHERE super.path in f(this.path)
Vnořené množiny Albert (1,12) • uchovává globální pozici uzlu • pozice uzlu = 2 celé čísla definující interval [left, right], který obsahuje všechny potomky • uzel p je předkem uzlu c právě když :p.left <= c.left <= c.right <= p.right • nevýhody : • dotazy na nadřízené (hledání intervalů obsahující daný bod) • nestálá struktura – přidávání prvku ≈ přepočet půlku struktury • vhodné pouze pro statické množiny Bert (2,3) Chuck (4,11) Donna (5,6) Eddy (7,8) Fred (9,10)
Vnořené množiny - vylepšení • původní pravidlo : • každý uzel (s pozicí [left, right]) má přesně (right - left - 1) / 2 potomků • vylepšení od Joe Celko : • vypuštěním výše uvedeného pravidla nechat větší mezery mezi left a right pro přidávané potomky • nepomůže, pokud left a right můžou být pouze celá čísla, protože za nějakou dobu se zaplní libovolně velká mezera
Vnořené intervaly - definice • jde o zobecnění vnořených množin • hranice intervalů již nemusí být celá čísla • potřebujeme hustší doménu • podle potřeby můžou být racionální nebo reálné čísla • nadále platí : uzel p je předkem uzlu c právě kdyžp.left <= c.left <= c.right <= p.right • je několik způsobů jak umístit do struktury nový uzel
Vnořené intervaly - 1.způsob • najdeme volný úsek <left1,right1> uvnitř intervalu rodiče • pak vkládaný uzel bude [(2*left1 + right1)/3, (left1 + 2*right1)/3] • a pro další potomky toho rodiče ještě jsou k dispozici :<left1, (2*left1 + right1)/3> a <(left1 + 2*right1)/3, right1> p.left left1 2*left1 + right1)/3 (left1 + 2*right1)/3 right1 p.right
Vnořené intervaly - 2.způsob y • 2-dimenzionální model : • osa x je right • osa y je left • relace „býti podmnožinou“ je částečné uspořádání 1.1 1.2 1.3 1 x
Vnořené intervaly - mapování • kořen zvolíme libovolně, např. [0,1] • každý uzel pak reprezentuje jeden pravoúhlý trojúhelník pod diagonálou • definujeme 2 důležité body: • bod konvergence do hloubky • průsečík diagonály a vertikály protínající uzel • bod konvergence do šířky • průsečík diagonály a horizontály protínající uzel y b.k. do hloubky b.k. do šířky 1.1 1 x
Vnořené intervaly - mapování2 • pro každý uzel pozice jeho : • prvního syna je v polovině úsečky mezi uzlem a b.k. do hloubky • dalších synů je v polovině úsečky mezi předchozím synem a b.k. do šířky • např.: uzel 1.2 je [ ¼ , ½ ]
Vnořené intervaly - symetrie • naše hustá doména nebude doména reálných ani racionálních čísel, ale doména dvojic zlomků • symetrie – každý podstrom má stejnou strukturu • syn je zmenšený rodič • obdoba fraktálů
Vnořené intervaly - normalizace • kvůli zmíněné symetrie souřadnice uzlu nejsou na sobě nezávislé • z jejich sumy lze vypočítat složky x a y • namísto dvojic zlomků stačí pamatovat součet dvojic, tj. jeden zlomek, tj. 2 celá čísla • tím jsme se dostali na úroveň vnořených množin v množství uchovávaných dat na jeden uzel
Vnořené intervaly - normalizace function x_numer( numer integer, denom integer ) RETURN integer IS ret_num integer; ret_den integer; BEGIN ret_num := numer+1; -- posun svisle nahoru na diagonálu ret_den := denom*2; -- souřadnice x je polovina podílu while floor(ret_num/2) = ret_num/2 loop -- redukce zlomku ret_num := ret_num/2; ret_den := ret_den/2; end loop; RETURN ret_num; -- pro čitatel -- RETURN ret_den;-- pro jmenovatel ve funkci x_denom() END;