Introducere în bazele de date grafice SQL Server 2017

Înainte de începerea cursului „Dezvoltator MS SQL Server” Am pregătit o altă traducere utilă pentru tine.

Bazele de date grafice sunt o tehnologie importantă pentru profesioniștii bazelor de date. Încerc să țin pasul cu inovațiile și noile tehnologii în acest domeniu și, după ce am lucrat cu baze de date relaționale și NoSQL, văd că rolul bazelor de date cu grafice devine din ce în ce mai important. Când lucrați cu date ierarhice complexe, nu numai bazele de date tradiționale sunt ineficiente, ci și NoSQL. Adesea, pe măsură ce crește numărul de niveluri de conexiune și dimensiunea bazei de date, performanța scade. Și pe măsură ce relațiile devin mai complexe, crește și numărul de JOIN.

Desigur, modelul relațional are soluții pentru lucrul cu ierarhii (de exemplu, folosind CTE-uri recursive), dar acestea sunt încă soluții. În același timp, funcționalitatea bazelor de date grafice SQL Server vă permite să gestionați cu ușurință mai multe niveluri de ierarhie. Atât modelul de date, cât și interogările sunt simplificate și, prin urmare, eficiența acestora crește. Cantitatea de cod este redusă semnificativ.

Bazele de date grafice sunt un limbaj expresiv pentru reprezentarea sistemelor complexe. Această tehnologie este deja folosită pe scară largă în industria IT în domenii precum rețelele sociale, sistemele antifraudă, analiza rețelelor IT, recomandările sociale, recomandările de produse și conținut.

Funcționalitatea bazei de date grafice din SQL Server este potrivită pentru scenariile în care datele sunt foarte interconectate și au relații bine definite.

Model de date grafic

Un graf este un set de vârfuri (noduri) și muchii (relații, muchii). Vârfurile reprezintă entități, iar marginile reprezintă relații ale căror atribute pot conține informații.

O bază de date cu grafice modelează entitățile ca un grafic așa cum este definit în teoria graficelor. Structurile de date sunt vârfuri și muchii. Atributele sunt proprietăți ale vârfurilor și muchiilor. O conexiune este o conexiune de vârfuri.

Spre deosebire de alte modele de date, bazele de date grafice prioritizează relațiile dintre entități. Prin urmare, nu este nevoie să calculați relații folosind chei străine sau orice alte mijloace. Este posibil să se creeze modele complexe de date folosind doar abstracții de vârf și margini.

În lumea modernă, modelarea relațiilor necesită tehnici din ce în ce mai complexe. Pentru a modela relațiile, SQL Server 2017 oferă capabilități de baze de date grafice. Vârfurile și muchiile graficului sunt reprezentate ca noi tipuri de tabele: NODE și EDGE. Interogările grafice folosesc o nouă funcție T-SQL numită MATCH(). Deoarece această funcționalitate este încorporată în SQL Server 2017, poate fi utilizată în bazele de date existente fără a fi nevoie de nicio conversie.

Beneficiile modelului grafic

Astăzi, companiile și utilizatorii solicită aplicații care să gestioneze din ce în ce mai multe date, așteptând în același timp performanță și fiabilitate ridicate. Reprezentarea datelor sub formă de grafic oferă un mijloc convenabil de a gestiona relații complexe. Această abordare rezolvă multe probleme și ajută la obținerea rezultatelor într-un context dat.

Se pare că multe aplicații vor beneficia de pe urma utilizării bazelor de date grafice în viitor.

Modelarea datelor: de la model relațional la model grafic

Introducere în bazele de date grafice SQL Server 2017
Exemplu

Să ne uităm la un exemplu de structură organizațională cu o ierarhie de angajați: un angajat raportează unui manager, un manager raportează unui manager superior și așa mai departe. În funcție de compania specifică, pot exista orice număr de niveluri în această ierarhie. Dar pe măsură ce numărul de niveluri crește, calcularea relațiilor într-o bază de date relațională devine din ce în ce mai dificilă. Este destul de greu de imaginat ierarhia angajaților, ierarhia în marketing sau conexiunile în rețelele de socializare. Să vedem cum SQL Graph poate rezolva problema gestionării diferitelor niveluri de ierarhie.

Pentru acest exemplu vom realiza un model de date simplu. Să creăm un tabel de angajați EMP cu act de identitate EMPNO si coloana M.G.R., indicând identificatorul supervizorului (managerului) al angajatului. Toate informațiile despre ierarhie sunt stocate în acest tabel și pot fi interogate folosind coloane EMPNO и M.G.R..

Introducere în bazele de date grafice SQL Server 2017
Următoarea diagramă prezintă același model de structură organizațională cu patru niveluri de imbricare într-o formă mai familiară. Angajații sunt vârfurile unui grafic dintr-un tabel EMP. Entitatea „angajat” este conectată la ea însăși prin conexiunea „submits” (ReportsTo). În termeni grafici, o legătură este o margine (EDGE) care conectează nodurile (NODE) ​​ale angajaților.

Introducere în bazele de date grafice SQL Server 2017

Să creăm o masă obișnuită EMP și adăugați valorile acolo în conformitate cu diagrama de mai sus.

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)

Imaginea de mai jos prezintă angajații:

  • angajat cu EMPNO 7369 se supune 7902;
  • angajat cu EMPNO 7902 se supune lui 7566
  • angajat cu EMPNO 7566 se supune lui 7839

Introducere în bazele de date grafice SQL Server 2017
Acum să ne uităm la o reprezentare grafică a acelorași date. Vârful ANGAJAT are mai multe atribute și este conectat la sine prin relația „subordonați” (EmplReportsTo). EmplReportsTo este numele relației.

Tabelul de margini (EDGE) poate conține, de asemenea, atribute.

Introducere în bazele de date grafice SQL Server 2017
Să creăm un tabel de noduri EmpNode

Sintaxa pentru crearea unui nod este destul de simplă: la expresie CREAȚI TABEL se adauga la sfarsit „CA NOD”.

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

Acum să convertim datele dintr-un tabel obișnuit într-un grafic. Următorul INSERT inserează date dintr-un tabel relațional EMP.

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

Introducere în bazele de date grafice SQL Server 2017
În tabelul de noduri într-o coloană specială $node_id_* ID-ul nodului este stocat ca JSON. Coloanele rămase ale acestui tabel conțin atributele nodului.

Crearea marginilor (EDGE)

Crearea unui tabel de margine este foarte asemănătoare cu crearea unui tabel de noduri, cu excepția faptului că este folosit cuvântul cheie „CA EDGE”.

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Introducere în bazele de date grafice SQL Server 2017

Acum să definim conexiunile între angajați folosind coloane EMPNO и M.G.R.. Diagrama structurii organizatorice arată clar cum se scrie 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);

Tabelul marginal implicit este format din trei coloane. Primul, $edge_id — identificator de margine în formă JSON. Celelalte doua ($from_id и $to_id) reprezintă legătura dintre noduri. În plus, marginile pot avea proprietăți suplimentare. În cazul nostru este Deptno.

Vizualizări de sistem

În vizualizarea sistemului sys.tables au apărut două noi coloane:

  1. is_edge
  2. is_node

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

Introducere în bazele de date grafice SQL Server 2017

ssms

Obiectele legate de grafice sunt localizate în folderul Graph Tables. Pictograma tabelului de noduri este marcată cu un punct, iar pictograma tabelului de margine este marcată cu două cercuri conectate (un pic ca ochelarii).

Introducere în bazele de date grafice SQL Server 2017

MATCH expresie

expresie MECI preluat din CQL (Cypher Query Language). Aceasta este o modalitate eficientă de a interoga proprietățile unui grafic. CQL începe cu o expresie MECI.

sintaxă

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

exemple

Să ne uităm la câteva exemple.

Interogarea de mai jos afișează angajații cărora Smith și managerul său le raportează.

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'

Introducere în bazele de date grafice SQL Server 2017
Următoarea interogare este pentru găsirea de angajați și manageri de nivel doi pentru Smith. Dacă eliminați propoziția UNDE, apoi rezultatul va afișa toți angajații.

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'

Introducere în bazele de date grafice SQL Server 2017
Și, în sfârșit, o solicitare pentru angajați și manageri de nivelul trei.

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'

Introducere în bazele de date grafice SQL Server 2017
Acum să schimbăm direcția pentru a-i primi pe șefii lui Smith.

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)

Introducere în bazele de date grafice SQL Server 2017

Concluzie

SQL Server 2017 s-a impus ca o soluție completă de întreprindere pentru diverse sarcini IT de afaceri. Prima versiune a SQL Graph este foarte promițătoare. Chiar și în ciuda unor limitări, există deja suficientă funcționalitate pentru a explora capacitățile graficelor.

Funcționalitatea SQL Graph este complet integrată în Motorul SQL. Cu toate acestea, așa cum sa menționat deja, SQL Server 2017 are următoarele limitări:

Fără suport pentru polimorfism.

  • Sunt acceptate doar conexiunile unidirecționale.
  • Edges nu poate actualiza coloanele $from_id și $to_id prin UPDATE.
  • Închiderile tranzitive nu sunt acceptate, dar pot fi obținute folosind CTE.
  • Suportul pentru obiectele OLTP în memorie este limitat.
  • Tabelele temporale (System-Versioned Temporal Table), tabelele temporare locale și globale nu sunt acceptate.
  • Tipurile de tabel și variabilele de tabel nu pot fi declarate ca NODE sau EDGE.
  • Interogările în mai multe baze de date nu sunt acceptate.
  • Nu există o modalitate directă sau un expert de a converti tabele obișnuite în tabele grafice.
  • Nu există nicio interfață grafică pentru afișarea graficelor, dar puteți utiliza Power BI.

Introducere în bazele de date grafice SQL Server 2017

Citeste mai mult:

Sursa: www.habr.com

Adauga un comentariu