Ievads grafu datu bāzēs SQL Server 2017

Pirms kursa uzsākšanas «MS SQL Server Developer» esam sagatavojuši jums vēl vienu noderīgu tulkojumu.

Grafu datu bāzes ir svarīga tehnoloģija datu bāzu speciālistiem. Es cenšos sekot līdzi inovācijām un jaunām tehnoloģijām šajā jomā un, strādājot ar attiecību un NoSQL datu bāzēm, redzu, ka grafu datu bāzu loma kļūst arvien nozīmīgāka. Strādājot ar sarežģītiem hierarhiskajiem datiem, tradicionālās datu bāzes un pat NoSQL ir maz efektīvas. Bieži, pieaugot saikņu slāņu skaitam un datu bāzes apjomam, novēro samazinātu veiktspēju. Un, pasliktinoties savstarpējām attiecībām, palielinās arī JOIN skaits.

Protams, relāciju modelī ir risinājumi, lai strādātu ar hierarhijām (piemēram, izmantojot rekursīvos CTE), taču tas joprojām paliek apvedceļš. Tajā pašā laikā SQL Server grafu datu bāzu funkcionalitāte ļauj viegli apstrādāt vairākus hierarhijas līmeņus. Gan datu modeļa, gan vaicājumu sarežģītība samazinās, kas, savukārt, palielina to efektivitāti. Koda apjoms ievērojami samazinās.

Grafu datu bāzes ir izteiksmīgs valoda, lai attēlotu sarežģītas sistēmas. Šī tehnoloģija jau diezgan plaši tiek izmantota IT nozarē tādos laukos kā sociālie tīkli, krāpšanas novēršanas sistēmas, IT tīklu analīze, sociālās rekomendācijas, produktu un satura ieteikumi.

SQL Server grafu datu bāzu funkcionalitāte ir piemērota scenārijiem, kuros dati ir cieši saistīti un tiem ir skaidri definētas attiecības.

Grafu datu modelis

Grafts ir virsotņu (mezglu, node) un malas (savienojumi, edge) kopums. Virsotnes attēlo entitātes, bet malas — attiecības, kuru atribūtos var būt informācija.

Grafu datu bāze modelē entitātes grafā tā, kā tas ir definēts grafu teorijā. Datu struktūras ir virsotnes un malas. Atribūti ir īpašības, kas pieder virsotnēm un malām. Savienojums ir virsotņu savienojums.

Atšķirībā no citām datu modeļiem, grafu datu bāzēs prioritātē ir savienojumi starp entitātēm. Tādējādi nav nepieciešams aprēķināt savienojumus, izmantojot ārējos atslēgas vai citus veidus. Ir iespējams izveidot sarežģītus datu modeļus, izmantojot tikai virsotņu un malu abstrakcijas.

Mūsdienu pasaulē attiecību modelēšana prasa aizvien sarežģītākas metodes. SQL Server 2017 piedāvā grafu datu bāzu iespējas attiecību modelēšanai. Grafu mezgli un malas tiek attēloti kā jauni tabulu tipi: NODE un EDGE. Pieprasījumiem uz grafu tiek izmantota jauna T-SQL funkcija, kuru sauc par MATCH(). Tā kā šī funkcionalitāte ir iekļauta SQL Server 2017, to var izmantot pastāvošajās datu bāzēs, neveicot to konvertēšanu.

Grafu modelēšanas priekšrocības

Pašlaik uzņēmumi un lietotāji pieprasa lietotnes, kas spēj apstrādāt arvien lielākus datu apjomus, vienlaikus sagaidot augstu veiktspēju un uzticamību. Datu attēlošana grafu veidā piedāvā ērtus līdzekļus sarežģītu attiecību apstrādei. Šis pieejas stils ļauj risināt daudzas problēmas, palīdzot iegūt rezultātus noteiktā kontekstā.

Izskatās, ka nākotnē daudzas lietotnes varēs gūt labumu no grafu datu bāzu izmantošanas.

Datu modelēšana: no relāciju modeļa uz grafu

Ievads grafu datu bāzēs SQL Server 2017
uzbrukumam

Apskatīsim piemēru par organizatorisko struktūru ar darbinieku hierarhiju: darbinieks pakļaujas vadītājam, vadītājs — vecākajam vadītājam un tā tālāk. Atkarībā no konkrētā uzņēmuma šajā hierarhijā var būt jebkurš līmeņu skaits. Taču, pieaugot līmeņu skaitam, saistību aprēķināšana relāciju datu bāzē kļūst arvien sarežģītāka. Tajā ir diezgan grūti attēlot darbinieku hierarhiju, mārketinga struktūru vai sociālo tīklu saites. Apskatīsim, kā ar SQL Graph var atrisināt problēmu, apstrādājot dažādu līmeņu hierarhiju.

Šim piemēram veidosim vienkāršu datu modeli. Izveidosim darbinieku tabulu EMP ar identifikatoru EMPNO un kolonnu MGR, kas norāda uz darbinieka vadītāja (menedžera) identifikatoru. Visa informācija par hierarhiju tiek glabāta šajā tabulā un var tikt pieprasīta ar kolonnu palīdzību. EMPNO un MGR.

Ievads grafu datu bāzēs SQL Server 2017
Nākamajā diagrammā attēlota tā pati organizatoriskā struktūra ar četriem līmeņiem, bet pazīstamākā veidā. Darbinieki — tas ir grafu mezglu šis tabula EMP. Jēdziens "darbinieks" ir saistīts pats ar sevi ar saiti "pakļaujas" (ReportsTo). Grafu terminoloģijā saite ir mala (EDGE), kas savieno darbinieku mezglus (NODE).

Ievads grafu datu bāzēs SQL Server 2017

Izveidosim parastu tabulu EMP un pievienosim tur vērtības saskaņā ar iepriekš minēto diagrammu.

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)

Zemāk redzamajā attēlā ir darbinieki:

  • darbinieks ar EMPNO 7369 pakļaujas 7902;
  • darbinieks ar EMPNO 7902 pakļaujas 7566
  • darbinieks ar EMPNO 7566 pakļaujas 7839

Ievads grafu datu bāzēs SQL Server 2017
Tagad aplūkosim šo pašu datu attēlojumu grafā. Virsotne EMPLOYEE satur vairākus atribūtus un ir saistīta pati ar sevi ar „pakļaujas” attiecību (EmplReportsTo). EmplReportsTo ir attiecības nosaukums.

Robežu tabulā (EDGE) var būt arī atribūti.

Ievads grafu datu bāzēs SQL Server 2017
Izveidosim mezglu tabulu EmpNode

Mezgla izveides sintakse ir diezgan vienkārša: izteiksmē CREATE TABLE tiek pievienots „AS NODE”.

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

Tagad pārvērtīsim datus no parastas tabulas grafā. Nākamais INSERT ievieto datus no relācijas tabulas EMP.

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

Ievads grafu datu bāzēs SQL Server 2017
Mezglu tabulā īpašajā kolonnā $node_id_* ievieto mezgla identifikatoru JSON formātā. Pārējās šīs tabulas kolonnās atrodas mezgla atribūti.

Izveidojam malas (EDGE)

Mala tabulas izveide ir ļoti līdzīga mezglu tabulas izveidei, izņemot to, ka tiek izmantots atslēgas vārds „AS EDGE”.

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Ievads grafu datu bāzēs SQL Server 2017

Tagad definēsim attiecības starp darbiniekiem, izmantojot kolonnas EMPNO un MGR. Uz organizācijas struktūras diagrammas labi redzams, kā to uzrakstīt INSERT.

Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 1),
   	(izvēlēties $node_id no EmpNode kur id = 13),20);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 2),
   	(izvēlēties $node_id no EmpNode kur id = 6),10);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 3),
   	(izvēlēties $node_id no EmpNode kur id = 6),10)
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 4),
   	(izvēlēties $node_id no EmpNode kur id = 9),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 5),
   	(izvēlēties $node_id no EmpNode kur id = 6),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 6),
   	(izvēlēties $node_id no EmpNode kur id = 9),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 7),
   	(izvēlēties $node_id no EmpNode kur id = 9),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 8),
   	(izvēlēties $node_id no EmpNode kur id = 4),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 9),
   	(izvēlēties $node_id no EmpNode kur id = 9),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 10),
   	(izvēlēties $node_id no EmpNode kur id = 6),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 11),
   	(izvēlēties $node_id no EmpNode kur id = 8),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 12),
   	(izvēlēties $node_id no EmpNode kur id = 6),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 13),
   	(izvēlēties $node_id no EmpNode kur id = 4),30);
Ievietot empReportsTo vērtības ((izvēlēties $node_id no EmpNode kur ID = 14),
   	(izvēlēties $node_id no EmpNode kur id = 7),30);

Defaultā malas tabula sastāv no trim kolonnām. Pirmā, $edge_id — ir malas identifikators JSON formātā. Divas citas ($from_id un $to_id) attēlo savienojumu starp mezgliem. Turklāt malām var būt papildu īpašības. Mūsu gadījumā tas ir Deptno.

Sistēmas skati

Sistēmas skatā sys.tables parādījās divas jaunas kolonnas:

  1. is_edge
  2. is_node

IZVĒLNI t.is_edge, t.is_node, *
NO sys.tables t
KUR vārds līdzīgs 'emp%'

Ievads grafu datu bāzēs SQL Server 2017

SSMS

Grafiem saistītie objekti ir izvietoti mapē Grafu tabulas. Mezglu tabulas ikona ir apzīmēta ar punktu, bet malu tabulas — ar diviem savienotiem apļiem (kas nedaudz līdzinās brillēm).

Ievads grafu datu bāzēs SQL Server 2017

IZTEIKUMS MATCH

Izteikums MATCH ir aizgūts no CQL (Cypher Query Language). Tas ir efektīvs veids, kā vaicāt grafu īpašības. CQL sākas ar izteikumu MATCH.

Sintakse

MATCH (<graf_search_pattern>)
 
<graf_search_pattern>::=
    {<mezglu_alias> {
                 	{ <-( <mala_alias> )- }
               	| { -( <mala_alias> )-> }
             	<mezglu_alias>
             	}
 	}
 	[ { UN ] { ( <graf_search_pattern> ) } ]
 	[ ,...n ]
 
<mezglu_alias> ::=
    mezglu_tabulas_vārds | mezglu_alias
 
<mala_alias> ::=
    malas_tabulas_vārds | mala_alias

Piemēri

Apskatīsim dažus piemērus.

Šis vaicājums parāda darbiniekus, kuriem pakļauts Smith un viņa vadītājs.

IZVĒLNI
E.EMPNO, E.ENAME, E.MGR, E1.EMPNO, E1.ENAME, E1.MGR
NO
    empnode e, empnode e1, empReportsTo m
KUR
    MATCH(e-(m)->e1)
UN un e.ENAME='SMITH'

Ievads grafu datu bāzēs SQL Server 2017
Nākamais vaicājums ir paredzēts, lai atrastu otro līmeni darbiniekus un vadītājus Smith uzņēmumā. Ja izslēdzam teikumu WHERE, rezultātā tiks parādīti visi darbinieki.

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'

Ievads grafu datu bāzēs SQL Server 2017
Un, beidzot, vaicājums darbiniekiem un trešā līmeņa vadītājiem.

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'

Ievads grafu datu bāzēs SQL Server 2017
Tagad mainīsim virzienu, lai iegūtu Smith vadītājus.

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)

Ievads grafu datu bāzēs SQL Server 2017

Secinājums

SQL Server 2017 ir pierādījis sevi kā pilnvērtīgu korporatīvu risinājumu dažādām IT uzdevumiem uzņēmumā. Pirmā SQL Graph versija ir ļoti solīga. Neskatoties uz dažām ierobežojumiem, jau tagad ir pietiekami daudz funkcionalitātes, lai izpētītu grafu iespējas.

SQL Graph funkcionalitāte ir pilnībā integrēta SQL Engine. Tomēr, kā jau minēts, SQL Server 2017 ir šādi ierobežojumi:

Nav atbalsta polymorphism.

  • Tiek atbalstītas tikai vienvirziena attiecības.
  • Nav iespējams atjaunināt $from_id un $to_id kolonnas caur UPDATE.
  • Nav atbalstītas tranzitīvās slēgšanas (transitive closure), bet tos var iegūt ar CTE.
  • Ir ierobežots atbalsts In-Memory OLTP objektiem.
  • Nav atbalstītas laika tabulas (System-Versioned Temporal Table), pagaidu lokālās un globālās tabulas.
  • Tabulu tipiem un tabulu mainīgajiem nav iespējams deklarēt kā NODE vai EDGE.
  • Nav atbalstīti vaicājumi starp datubāzēm (cross-database queries).
  • Nav tieša veida vai kāda vedņa (wizard), lai pārveidotu parastās tabulas par grafu.
  • Grafu attēlošanai nav GUI, bet var izmantot Power BI.

Ievads grafu datu bāzēs SQL Server 2017

Lasīt vēl:

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster