Enne kursuse algust
Graafikandmebaasid on andmebaasiprofessionaalide jaoks oluline tehnoloogia. Püüan jälgida selle valdkonna uuendusi ja uusi tehnoloogiaid ning pärast relatsiooni- ja NoSQL-andmebaasidega töötamist näen, et graafikuandmebaaside roll muutub üha suuremaks. Keeruliste hierarhiliste andmetega töötamisel ei ole mitte ainult traditsioonilised andmebaasid, vaid ka NoSQL ebaefektiivsed. Sageli väheneb jõudlus lingitasemete arvu ja andmebaasi suuruse suurenemisega. Ja kui suhted muutuvad keerukamaks, suureneb ka JOIN-ide arv.
Muidugi on relatsioonimudelis lahendusi hierarhiatega töötamiseks (näiteks rekursiivsete CTE-de kasutamine), kuid need on siiski lahendused. Samal ajal muudab SQL Serveri graafikuandmebaaside funktsionaalsus mitme hierarhiataseme haldamise lihtsaks. Nii andmemudel kui ka päringud on lihtsustatud ja seetõttu suureneb nende tõhusus. Vähendab oluliselt koodi hulka.
Graafikandmebaasid on väljendusrikas keel keeruliste süsteemide esitamiseks. Seda tehnoloogiat kasutatakse IT-tööstuses juba üsna laialdaselt sellistes valdkondades nagu sotsiaalvõrgustikud, pettusevastased süsteemid, IT-võrkude analüüs, sotsiaalsed soovitused, toote- ja sisusoovitused.
SQL Serveri graafikuandmebaasi funktsionaalsus sobib stsenaariumide jaoks, kus andmed on omavahel tihedalt seotud ja neil on täpselt määratletud seosed.
Graafiku andmemudel
Graaf on tippude (sõlmede, sõlmede) ja servade (seosed, serv) kogum. Tipud tähistavad üksusi ja servad linke, mille atribuudid võivad sisaldada teavet.
Graafikandmebaas modelleerib olemeid graafikuna, nagu on määratletud graafiteoorias. Andmestruktuurid on tipud ja servad. Atribuudid on tippude ja servade omadused. Ühendus on tippude ühendus.
Erinevalt teistest andmemudelitest seavad graafikuandmebaasid esikohale olemitevahelised suhted. Seetõttu ei ole vaja suhteid arvutada võõrvõtmete abil või muul viisil. On võimalik luua keerulisi andmemudeleid kasutades ainult tippude ja servade abstraktsioone.
Tänapäeva maailmas nõuab suhete modelleerimine üha keerukamaid tehnikaid. Seoste modelleerimiseks pakub SQL Server 2017 graafikuandmebaasi võimalusi. Graafi tipud ja servad on kujutatud uut tüüpi tabelitena: NODE ja EDGE. Graafikupäringud kasutavad uut T-SQL-i funktsiooni nimega MATCH(). Kuna see funktsioon on sisse ehitatud SQL Server 2017-sse, saab seda kasutada olemasolevates andmebaasides, ilma et oleks vaja andmebaasi teisendada.
Graafikumudeli eelised
Tänapäeval nõuavad ettevõtted ja kasutajad rakendusi, mis töötavad üha rohkemate andmetega, eeldades samas suurt jõudlust ja töökindlust. Andmete graafiline esitus pakub mugavat vahendit keerukate suhete käsitlemiseks. See lähenemisviis lahendab palju probleeme ja aitab saavutada tulemusi antud kontekstis.
Näib, et paljud rakendused saavad tulevikus graafikuandmebaasidest kasu.
Andmete modelleerimine: relatsioonist graafilise modelleerimiseni
Näide
Vaatame näidet töötajate hierarhiaga organisatsioonistruktuurist: töötaja annab aru juhile, juht kõrgemale juhile jne. Olenevalt konkreetsest ettevõttest võib selles hierarhias olla suvaline arv tasemeid. Kuid tasemete arvu suurenedes muutub seoste arvutamine relatsiooniandmebaasis üha keerulisemaks. Üsna raske on ette kujutada töötajate hierarhiat, hierarhiat turunduses või sotsiaalmeedia ühendustes. Vaatame, kuidas SQL Graph suudab lahendada erinevate hierarhiatasemete käsitlemise probleemi.
Selle näite jaoks koostame lihtsa andmemudeli. Koostage töötajate tabel EMP ID-ga EMPNO ja veerg M.G.R.A, mis osutab töötaja juhi (juhi) isikutunnistusele. Kogu teave hierarhia kohta on salvestatud sellesse tabelisse ja seda saab veergude abil küsida EMPNO и M.G.R..
Järgmine diagramm näitab ka sama organisatsioonidiagrammi mudelit nelja pesastamistasemega tuttavamal kujul. Töötajad on graafiku tipud tabelist EMP. Üksus "töötaja" on endaga seotud suhtega "esitab" (ReportsTo). Graafiku terminites on link serv (EDGE), mis ühendab töötajate sõlme (sõlmed).
Koostame tavalise tabeli EMP ja lisage sinna väärtused vastavalt ülaltoodud diagrammile.
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)
Alloleval joonisel on näidatud töötajad:
- töötajaga EMPNO 7369 on 7902 alluvus;
- töötajaga EMPNO 7902 alluv 7566-le
- töötajaga EMPNO 7566 alluv 7839-le
Nüüd vaatame samade andmete esitamist graafiku kujul. Sõlmel TÖÖTAJA on mitu atribuuti ja see on endaga seotud "esitab" seosega (EmplReportsTo). EmplReportsTo on suhte nimi.
Servatabelil (EDGE) võivad samuti olla atribuudid.
Looge sõlmetabel EmpNode
Sõlme loomise süntaks on üsna lihtne: väljendile LOE TABEL lõppu lisatud KUI SÕLM.
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Teisendame nüüd andmed tavalisest tabelist graafikuteks. Edasi INSERT lisab andmed relatsioonitabelist EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
Sõlme tabelis spetsiaalses veerus $node_id_*
hosti ID salvestatakse JSON-ina. Selle tabeli ülejäänud veerud sisaldavad sõlme atribuute.
Loo servad (EDGE)
Servatabeli loomine on väga sarnane sõlmetabeli loomisega, välja arvatud märksõna SERVNA.
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Nüüd määratleme töötajatevahelised suhted veergude abil EMPNO и M.G.R.. Organisatsiooniskeem näitab selgelt, kuidas kirjutada 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);
Servatabelil on vaikimisi kolm veergu. Esiteks $edge_id
— serva identifikaator JSON-vormingus. Teised kaks ($from_id
и $to_id
) tähistavad sõlmede vahelist suhet. Lisaks võivad servadel olla täiendavaid omadusi. Meie puhul see Deptno.
Süsteemivaated
Süsteemivaates sys.tables
Seal on kaks uut veergu:
- on_serv
- on_sõlm
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Graafikutega seotud objektid asuvad kaustas Graafikutabelid. Sõlmetabeli ikoon on tähistatud punktiga ja servatabeli ikoon on tähistatud kahe ühendatud ringiga (mis näeb välja nagu prillid).
MATCH väljend
Väljendus MATCH võetud CQL-ist (Cypher Query Language). See on tõhus viis graafiku omaduste päringu tegemiseks. CQL algab avaldisega MATCH.
süntaks
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
näited
Vaatame mõnda näidet.
Allolev päring kuvab töötajad, kellele Smith ja tema juht aru annavad.
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'
Järgmine päring on Smithile töötajate ja teise taseme juhtide leidmiseks. Kui eemaldate pakkumise KUS, siis kuvatakse selle tulemusel kõik töötajad.
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'
Ja lõpuks palve kolmanda taseme töötajatele ja juhtidele.
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'
Nüüd muudame suunda, et saada Smithi ülemused.
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)
Järeldus
SQL Server 2017 on end tõestanud tervikliku ettevõttelahendusena mitmesuguste äri IT-vajaduste jaoks. SQL Graphi esimene versioon on väga paljutõotav. Isegi vaatamata mõningatele piirangutele on graafikute võimaluste uurimiseks juba piisavalt funktsionaalsust.
SQL Graphi funktsionaalsus on täielikult integreeritud SQL Engine'i. Kuid nagu juba mainitud, on SQL Server 2017-l järgmised piirangud.
Pole toetust polümorfismile.
- Toetatakse ainult ühesuunalisi linke.
- Edges ei saa värskendada oma veerge $from_id ja $to_id UPDATE kaudu.
- Transitiivseid sulgemisi ei toetata, kuid neid saab hankida CTE-de abil.
- Piiratud tugi mälusiseste OLTP-objektide jaoks.
- Ajutisi tabeleid (System-Versioned Temporal Table), ajutisi kohalikke ja globaalseid tabeleid ei toetata.
- Tabelitüüpe ja tabelimuutujaid ei saa deklareerida kui NODE või EDGE.
- Andmebaasiüleseid päringuid ei toetata.
- Tavaliste tabelite graafiktabeliteks teisendamiseks pole otsest viisi ega mingit viisardit (viisardit).
- Graafikute kuvamiseks pole GUI-d, kuid kasutada saab Power BI-d.
Loe rohkem:
Allikas: www.habr.com