Prije početka tečaja
Grafičke baze podataka važna su tehnologija za stručnjake za baze podataka. Trudim se pratiti inovacije i nove tehnologije u ovom području i, nakon rada s relacijskim i NoSQL bazama podataka, vidim da uloga graf baza podataka postaje sve važnija. Pri radu sa složenim hijerarhijskim podacima neučinkovite su ne samo tradicionalne baze podataka, već i NoSQL. Često, kako se povećava broj razina veze i veličina baze podataka, performanse se smanjuju. Kako odnosi postaju složeniji, povećava se i broj JOIN-ova.
Naravno, relacijski model ima rješenja za rad s hijerarhijama (na primjer, korištenjem rekurzivnih CTE-ova), ali to su još uvijek zaobilazna rješenja. U isto vrijeme, funkcionalnost baza podataka s grafikonima SQL Servera omogućuje vam jednostavno rukovanje višestrukim razinama hijerarhije. I model podataka i upiti su pojednostavljeni, a time i njihova učinkovitost. Količina koda je značajno smanjena.
Grafičke baze podataka izražajan su jezik za predstavljanje složenih sustava. Ova se tehnologija već prilično široko koristi u IT industriji u područjima kao što su društvene mreže, sustavi protiv prijevara, analiza IT mreža, društvene preporuke, preporuke proizvoda i sadržaja.
Funkcionalnost baze podataka grafikona u SQL Serveru prikladna je za scenarije u kojima su podaci visoko međusobno povezani i imaju dobro definirane odnose.
Grafički model podataka
Graf je skup vrhova (čvorova) i rubova (odnosa, ruba). Vrhovi predstavljaju entitete, a rubovi odnose čiji atributi mogu sadržavati informacije.
Baza podataka grafova modelira entitete kao graf kako je definirano u teoriji grafova. Strukture podataka su vrhovi i bridovi. Atributi su svojstva vrhova i bridova. Veza je veza vrhova.
Za razliku od drugih modela podataka, baze podataka grafikona daju prioritet odnosima između entiteta. Stoga nema potrebe izračunavati odnose korištenjem stranih ključeva ili bilo kojeg drugog sredstva. Moguće je izraditi složene modele podataka koristeći samo apstrakcije vrhova i rubova.
U suvremenom svijetu modeliranje odnosa zahtijeva sve složenije tehnike. Za modeliranje odnosa, SQL Server 2017 nudi mogućnosti baze podataka grafikona. Vrhovi i rubovi grafa predstavljeni su kao nove vrste tablica: NODE i EDGE. Grafovi upiti koriste novu T-SQL funkciju pod nazivom MATCH(). Budući da je ova funkcionalnost ugrađena u SQL Server 2017, može se koristiti u vašim postojećim bazama podataka bez potrebe za bilo kakvom pretvorbom.
Prednosti graf modela
Danas tvrtke i korisnici zahtijevaju aplikacije koje obrađuju sve više i više podataka, dok očekuju visoku izvedbu i pouzdanost. Predstavljanje podataka u obliku grafikona nudi prikladan način rukovanja složenim odnosima. Ovaj pristup rješava mnoge probleme i pomaže u postizanju rezultata u datom kontekstu.
Čini se da će mnoge aplikacije imati koristi od upotrebe baza podataka s grafikonima u budućnosti.
Modeliranje podataka: od relacijskog do graf modela
Primjer
Pogledajmo primjer organizacijske strukture s hijerarhijom zaposlenika: zaposlenik je odgovoran menadžeru, menadžer je odgovoran višem menadžeru i tako dalje. Ovisno o konkretnoj tvrtki, može postojati bilo koji broj razina u ovoj hijerarhiji. Ali kako se broj razina povećava, izračunavanje odnosa u relacijskoj bazi podataka postaje sve teže. Prilično je teško zamisliti hijerarhiju zaposlenika, hijerarhiju u marketingu ili veze na društvenim mrežama. Pogledajmo kako SQL Graph može riješiti problem rukovanja različitim razinama hijerarhije.
Za ovaj primjer napravit ćemo jednostavan model podataka. Kreirajmo tablicu zaposlenika EMP s osobnom iskaznicom EMPNO i stupac M.G.R., koji označava identifikator nadređenog (menadžera) zaposlenika. Sve informacije o hijerarhiji pohranjene su u ovoj tablici i mogu se postavljati upiti pomoću stupaca EMPNO и M.G.R..
Sljedeći dijagram prikazuje isti model organizacijske strukture s četiri razine ugniježđenja u poznatijem obliku. Zaposlenici su vrhovi grafa iz tablice EMP. Entitet “zaposlenik” povezan je sam sa sobom vezom “podnosi” (ReportsTo). U smislu grafa, veza je rub (EDGE) koji povezuje čvorove (NODE) zaposlenika.
Napravimo običnu tablicu EMP i tamo dodajte vrijednosti u skladu s gornjim dijagramom.
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 slici ispod prikazani su zaposlenici:
- djelatnik sa EMPNO 7369 pokorava se 7902;
- djelatnik sa EMPNO 7902 poštuje 7566
- djelatnik sa EMPNO 7566 poštuje 7839
Sada pogledajmo grafički prikaz istih podataka. Vertex EMPLOYEE ima nekoliko atributa i povezan je sam sa sobom odnosom “podređeni” (EmplReportsTo). EmplReportsTo je naziv odnosa.
Rubna tablica (EDGE) također može sadržavati atribute.
Kreirajmo tablicu čvorova EmpNode
Sintaksa za stvaranje čvora je prilično jednostavna: do izraza IZRADI TABELU dodaje se na kraj "KAO ČVOR".
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Pretvorimo sada podatke iz obične tablice u grafikon. Sljedeći INSERT umeće podatke iz relacijske tablice EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
U tablici čvorova u posebnom stupcu $node_id_*
identifikator čvora pohranjuje se kao JSON. Preostali stupci ove tablice sadrže atribute čvora.
Stvaranje rubova (EDGE)
Stvaranje rubne tablice vrlo je slično stvaranju tablice čvorova, osim što se koristi ključna riječ "KAO RUB".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Sada definirajmo veze između zaposlenika pomoću stupaca EMPNO и M.G.R.. Dijagram organizacijske strukture jasno pokazuje kako pisati 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);
Zadana rubna tablica sastoji se od tri stupca. Prvi, $edge_id
— identifikator ruba u JSON obliku. Druga dva ($from_id
и $to_id
) predstavljaju vezu između čvorova. Osim toga, rubovi mogu imati dodatna svojstva. U našem slučaju jest Deptno.
Prikazi sustava
U prikazu sustava sys.tables
pojavile su se dvije nove rubrike:
- je_rub
- je_čvor
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Objekti koji se odnose na grafove nalaze se u mapi Tablice grafova. Ikona tablice čvorova označena je točkom, a ikona tablice rubova označena je s dva spojena kružića (što pomalo liči na naočale).
MATCH izraz
izraz MATCH preuzeto iz CQL (Cypher Query Language). Ovo je učinkovit način za ispitivanje svojstava grafa. CQL počinje izrazom MATCH.
sintaksa
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
Primjeri
Pogledajmo nekoliko primjera.
Upit u nastavku prikazuje zaposlenike kojima Smith i njegov upravitelj odgovaraju.
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'
Sljedeći upit je za pronalaženje zaposlenika druge razine i menadžera za Smith. Ako uklonite rečenicu GDJE, tada će rezultat prikazati sve zaposlenike.
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'
I na kraju zahtjev za zaposlenike i menadžere treće razine.
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'
Sada promijenimo smjer da uhvatimo Smithove šefove.
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)
Zaključak
SQL Server 2017 etablirao se kao cjelovito poslovno rješenje za različite IT poslovne zadatke. Prva verzija SQL Grapha je vrlo obećavajuća. Čak i unatoč nekim ograničenjima, već postoji dovoljno funkcionalnosti za istraživanje mogućnosti grafikona.
Funkcionalnost SQL Graph-a potpuno je integrirana u SQL Engine. Međutim, kao što je već navedeno, SQL Server 2017 ima sljedeća ograničenja:
Nema podrške za polimorfizam.
- Podržane su samo jednosmjerne veze.
- Rubovi ne mogu ažurirati stupce $from_id i $to_id putem UPDATE.
- Prijelazna zatvaranja nisu podržana, ali se mogu dobiti pomoću CTE-a.
- Podrška za In-Memory OLTP objekte je ograničena.
- Vremenske tablice (vremenska tablica s verzijom sustava), privremene lokalne i globalne tablice nisu podržane.
- Vrste tablica i varijable tablice ne mogu se deklarirati kao NODE ili EDGE.
- Upiti između baza podataka nisu podržani.
- Ne postoji izravan način ili čarobnjak za pretvaranje uobičajenih tablica u tablice grafikona.
- Ne postoji GUI za prikaz grafikona, ali možete koristiti Power BI.
Čitaj više:
Izvor: www.habr.com