Úvod do databází grafů SQL Server 2017

Před začátkem kurzu "MS SQL Server Developer" Připravili jsme pro vás další užitečný překlad.

Grafové databáze jsou důležitou technologií pro databázové profesionály. Snažím se držet krok s inovacemi a novými technologiemi v této oblasti a po práci s relačními a NoSQL databázemi vnímám roli grafových databází stále důležitější. Při práci se složitými hierarchickými daty jsou neefektivní nejen klasické databáze, ale i NoSQL. S rostoucím počtem úrovní připojení a velikostí databáze se často snižuje výkon. A jak se vztahy stávají složitějšími, zvyšuje se i počet JOINů.

Relační model má samozřejmě řešení pro práci s hierarchiemi (například pomocí rekurzivních CTE), ale stále jde o řešení. Funkčnost databází grafů SQL Server vám zároveň umožňuje snadno zvládnout více úrovní hierarchie. Datový model i dotazy jsou zjednodušeny, a proto se zvyšuje jejich efektivita. Množství kódu je výrazně sníženo.

Grafové databáze jsou expresivní jazyk pro reprezentaci složitých systémů. Tato technologie je již poměrně široce používána v IT průmyslu v oblastech, jako jsou sociální sítě, systémy proti podvodům, analýza IT sítí, sociální doporučení, doporučení produktů a obsahu.

Funkce databáze grafů v SQL Server je vhodná pro scénáře, kde jsou data vysoce propojena a mají dobře definované vztahy.

Grafový datový model

Graf je množina vrcholů (uzlů) a hran (vztahy, hrana). Vrcholy představují entity a hrany představují vztahy, jejichž atributy mohou obsahovat informace.

Databáze grafů modeluje entity jako graf, jak je definováno v teorii grafů. Datové struktury jsou vrcholy a hrany. Atributy jsou vlastnosti vrcholů a hran. Spojení je spojení vrcholů.

Na rozdíl od jiných datových modelů upřednostňují grafové databáze vztahy mezi entitami. Není tedy potřeba vypočítávat vztahy pomocí cizích klíčů ani žádných jiných prostředků. Je možné vytvářet komplexní datové modely pouze pomocí vrcholových a okrajových abstrakcí.

V moderním světě vyžaduje modelování vztahů stále složitější techniky. Pro modelování vztahů nabízí SQL Server 2017 funkce grafové databáze. Vrcholy a hrany grafu jsou reprezentovány jako nové typy tabulek: NODE a EDGE. Grafové dotazy používají novou funkci T-SQL nazvanou MATCH(). Vzhledem k tomu, že tato funkce je integrována do SQL Server 2017, lze ji použít ve vašich stávajících databázích bez nutnosti jakékoli konverze.

Výhody grafového modelu

Firmy a uživatelé dnes požadují aplikace, které zpracovávají stále více dat a přitom očekávají vysoký výkon a spolehlivost. Znázornění dat jako graf nabízí pohodlný způsob zpracování složitých vztahů. Tento přístup řeší mnoho problémů a pomáhá získat výsledky v daném kontextu.

Zdá se, že mnoho aplikací bude v budoucnu těžit z používání databází grafů.

Datové modelování: od relačního ke grafovému modelu

Úvod do databází grafů SQL Server 2017
příklad

Podívejme se na příklad organizační struktury s hierarchií zaměstnanců: zaměstnanec se hlásí manažerovi, manažer se hlásí senior manažerovi a tak dále. V závislosti na konkrétní společnosti může být v této hierarchii libovolný počet úrovní. Ale jak se zvyšuje počet úrovní, je výpočet vztahů v relační databázi stále obtížnější. Je poměrně těžké si představit hierarchii zaměstnanců, hierarchii v marketingu nebo propojení v sociálních sítích. Podívejme se, jak může SQL Graph vyřešit problém manipulace s různými úrovněmi hierarchie.

Pro tento příklad vytvoříme jednoduchý datový model. Vytvořme tabulku zaměstnanců EMP s ID EMPNO a sloupec MGR, s uvedením identifikátoru nadřízeného zaměstnance (vedoucího). Všechny informace o hierarchii jsou uloženy v této tabulce a lze se na ně dotazovat pomocí sloupců EMPNO и MGR.

Úvod do databází grafů SQL Server 2017
Následující diagram ukazuje stejný model organizační struktury se čtyřmi úrovněmi vnoření ve známější podobě. Zaměstnanci jsou vrcholy grafu z tabulky EMP. Entita „zaměstnanec“ je sama se sebou spojena spojením „submits“ (ReportsTo). Z hlediska grafu je spojnicí hrana (EDGE), která spojuje uzly (NODE) ​​zaměstnanců.

Úvod do databází grafů SQL Server 2017

Vytvoříme běžnou tabulku EMP a přidejte tam hodnoty podle výše uvedeného diagramu.

CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
 
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)

Na následujícím obrázku jsou zaměstnanci:

  • zaměstnanec s EMPNO 7369 poslouchá 7902;
  • zaměstnanec s EMPNO 7902 poslouchá 7566
  • zaměstnanec s EMPNO 7566 poslouchá 7839

Úvod do databází grafů SQL Server 2017
Nyní se podívejme na grafovou reprezentaci stejných dat. Vrchol ZAMĚSTNANCE má několik atributů a je sám se sebou spojen vztahem „podřízení“ (EmplReportsTo). EmplReportsTo je název vztahu.

Tabulka hran (EDGE) může také obsahovat atributy.

Úvod do databází grafů SQL Server 2017
Vytvořme tabulku uzlů EmpNode

Syntaxe pro vytvoření uzlu je poměrně jednoduchá: k výrazu VYTVOŘENÍ TABULKY se přidává na konec "JAKO UZEL".

CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;

Nyní převedeme data z běžné tabulky do grafu. další INSERT vloží data z relační tabulky EMP.

INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp

Úvod do databází grafů SQL Server 2017
V tabulce uzlů ve zvláštním sloupci $node_id_* identifikátor uzlu je uložen jako JSON. Zbývající sloupce této tabulky obsahují atributy uzlu.

Vytváření hran (EDGE)

Vytvoření tabulky hran je velmi podobné vytvoření tabulky uzlů, až na to, že je použito klíčové slovo "Jako okraj".

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Úvod do databází grafů SQL Server 2017

Nyní nadefinujme spojení mezi zaměstnanci pomocí sloupců EMPNO и MGR. Schéma organizační struktury jasně ukazuje, jak psát INSERT.

INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
   	(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
   	(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
   	(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
   	(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
   	(SELECT $node_id FROM EmpNode WHERE id = 7),30);

Výchozí tabulka hran se skládá ze tří sloupců. První, $edge_id — identifikátor hrany ve tvaru JSON. Další dva ($from_id и $to_id) představují spojení mezi uzly. Kromě toho mohou mít hrany další vlastnosti. V našem případě ano Deptno.

Systémové pohledy

V systémovém pohledu sys.tables objevily se dva nové sloupce:

  1. is_edge
  2. je_uzel

SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'

Úvod do databází grafů SQL Server 2017

ssms

Objekty související s grafy jsou umístěny ve složce Tabulky grafů. Ikona tabulky uzlů je označena tečkou a ikona tabulky okrajů je označena dvěma spojenými kruhy (trochu jako brýle).

Úvod do databází grafů SQL Server 2017

MATCH výraz

Výraz MATCH převzato z CQL (Cypher Query Language). Jedná se o efektivní způsob dotazování na vlastnosti grafu. CQL začíná výrazem MATCH.

syntax

MATCH (<graph_search_pattern>)
 
<graph_search_pattern>::=
    {<node_alias> {
                 	{ <-( <edge_alias> )- }
               	| { -( <edge_alias> )-> }
             	<node_alias>
             	}
 	}
 	[ { AND } { ( <graph_search_pattern> ) } ]
 	[ ,...n ]
 
<node_alias> ::=
    node_table_name | node_alias
 
<edge_alias> ::=
    edge_table_name | edge_alias

Příklady

Podívejme se na pár příkladů.

Dotaz níže zobrazuje zaměstnance, kterým Smith a jeho manažer podléhají.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
    empnode e, empnode e1, empReportsTo m
WHERE
    MATCH(e-(m)->e1)
and e.ENAME='SMITH'

Úvod do databází grafů SQL Server 2017
Následující dotaz je pro nalezení zaměstnanců a manažerů druhé úrovně pro Smith. Pokud odstraníte větu KDE, pak výsledek zobrazí všechny zaměstnance.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
    MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'

Úvod do databází grafů SQL Server 2017
A nakonec požadavek na zaměstnance a manažery třetího stupně.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
    MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'

Úvod do databází grafů SQL Server 2017
Nyní změňme směr, abychom získali Smithovy šéfy.

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
    MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)

Úvod do databází grafů SQL Server 2017

Závěr

SQL Server 2017 se etabloval jako kompletní podnikové řešení pro různé podnikové úkoly IT. První verze SQL Graph je velmi slibná. I přes určitá omezení již existuje dostatek funkcí pro prozkoumání možností grafů.

Funkce SQL Graph je plně integrována do SQL Engine. Jak již bylo uvedeno, SQL Server 2017 má následující omezení:

Žádná podpora polymorfismu.

  • Podporována jsou pouze jednosměrná připojení.
  • Edge nemůže aktualizovat sloupce $from_id a $to_id prostřednictvím UPDATE.
  • Transitivní uzávěry nejsou podporovány, ale lze je získat pomocí CTE.
  • Podpora objektů OLTP v paměti je omezená.
  • Dočasné tabulky (System-Versioned Temporal Table), dočasné místní a globální tabulky nejsou podporovány.
  • Typy tabulek a proměnné tabulky nelze deklarovat jako NODE nebo EDGE.
  • Dotazy napříč databázemi nejsou podporovány.
  • Neexistuje žádný přímý způsob nebo průvodce, jak převést běžné tabulky na tabulky grafů.
  • Neexistuje žádné grafické uživatelské rozhraní pro zobrazení grafů, ale můžete použít Power BI.

Úvod do databází grafů SQL Server 2017

Přečtěte si více:

Zdroj: www.habr.com

Přidat komentář