Pred začetkom tečaja
Podatkovne baze grafov so pomembna tehnologija za strokovnjake za baze podatkov. Poskušam slediti novostim in novim tehnologijam na tem področju in po delu z relacijskimi in NoSQL podatkovnimi bazami vidim, da postaja vloga grafičnih podatkovnih baz vse večja. Pri delu s kompleksnimi hierarhičnimi podatki so neučinkovite ne le tradicionalne baze podatkov, ampak tudi NoSQL. Pogosto s povečanjem števila ravni povezav in velikosti baze podatkov pride do zmanjšanja zmogljivosti. In ko razmerja postanejo bolj zapletena, se poveča tudi število JOIN-jev.
Seveda v relacijskem modelu obstajajo rešitve za delo s hierarhijami (na primer z uporabo rekurzivnih CTE), vendar so to še vedno rešitve. Hkrati pa funkcionalnost podatkovnih baz grafov SQL Server olajša upravljanje več ravni hierarhije. Tako podatkovni model kot poizvedbe so poenostavljeni, s čimer se poveča njihova učinkovitost. Znatno zmanjša količino kode.
Podatkovne zbirke grafov so izrazen jezik za predstavitev kompleksnih sistemov. Ta tehnologija se že precej pogosto uporablja v industriji IT na področjih, kot so družbena omrežja, sistemi za boj proti goljufijam, analiza omrežij IT, socialna priporočila, priporočila za izdelke in vsebino.
Funkcionalnost baze podatkov grafov v strežniku SQL Server je primerna za scenarije, kjer so podatki zelo povezani in imajo dobro definirana razmerja.
Graf podatkovni model
Graf je množica vozlišč (vozlišča, vozlišče) in robov (relacije, rob). Točke predstavljajo entitete, robovi pa povezave, katerih atributi lahko vsebujejo informacije.
Baza podatkov grafov modelira entitete kot graf, kot je opredeljeno v teoriji grafov. Podatkovne strukture so vozlišča in robovi. Atributi so lastnosti oglišč in robov. Povezava je povezava vozlišč.
Za razliko od drugih podatkovnih modelov grafične baze podatkov dajejo prednost odnosom med entitetami. Zato ni potrebe po izračunavanju odnosov z uporabo tujih ključev ali na kakšen drug način. Možno je ustvariti kompleksne podatkovne modele z uporabo samo abstrakcij vozlišč in robov.
V današnjem svetu modeliranje odnosov zahteva vedno bolj izpopolnjene tehnike. Za modeliranje odnosov SQL Server 2017 ponuja zmožnosti baze podatkov grafov. Točke in robovi grafa so predstavljeni kot nove vrste tabel: NODE in EDGE. Grafske poizvedbe uporabljajo novo funkcijo T-SQL, imenovano MATCH(). Ker je ta funkcionalnost vgrajena v SQL Server 2017, jo je mogoče uporabiti v vaših obstoječih zbirkah podatkov brez potrebe po pretvorbi baze podatkov.
Prednosti modela Graph
Dandanes podjetja in uporabniki zahtevajo aplikacije, ki delujejo z vedno več podatki, obenem pa pričakujejo visoko zmogljivost in zanesljivost. Grafična predstavitev podatkov ponuja priročno sredstvo za obravnavanje kompleksnih odnosov. Ta pristop rešuje številne težave in pomaga doseči rezultate v danem kontekstu.
Videti je, da bodo številne aplikacije v prihodnosti imele koristi od podatkovnih zbirk grafov.
Podatkovno modeliranje: od relacijskega k grafičnemu modeliranju
Primer
Oglejmo si primer organizacijske strukture s hierarhijo zaposlenih: zaposleni poroča vodji, vodja poroča višjemu vodji itd. V tej hierarhiji je lahko poljubno število stopenj, odvisno od posameznega podjetja. Ko pa se število ravni povečuje, postaja računanje odnosov v relacijski bazi podatkov vedno težje. Kar težko si je predstavljati hierarhijo zaposlenih, hierarhijo v marketingu ali povezavah na družbenih omrežjih. Poglejmo, kako lahko SQL Graph reši problem obravnavanja različnih ravni hierarhije.
Za ta primer izdelajmo preprost podatkovni model. Ustvarite tabelo zaposlenih EMP z id EMPNO in stolpec M.G.R.A, ki kaže na ID vodje (vodje) zaposlenega. Vse informacije o hierarhiji so shranjene v tej tabeli in jih je mogoče poizvedovati z uporabo stolpcev EMPNO и M.G.R..
Naslednji diagram prikazuje tudi isti model organigrama s štirimi ravnmi gnezdenja v bolj znani obliki. Zaposleni so oglišča grafa iz tabele EMP. Entiteta "zaposleni" je sama s seboj povezana z razmerjem "oddaja" (ReportsTo). V grafičnem smislu je povezava rob (EDGE), ki povezuje vozlišča (NODE) zaposlenih.
Ustvarimo običajno tabelo EMP in tam dodajte vrednosti v skladu z zgornjim diagramom.
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)
Spodnja slika prikazuje zaposlene:
- zaposleni z EMPNO 7369 je podrejen 7902;
- zaposleni z EMPNO 7902 podrejen 7566
- zaposleni z EMPNO 7566 podrejen 7839
Zdaj pa si poglejmo predstavitev istih podatkov v obliki grafa. Vozlišče EMPLOYEE ima več atributov in je povezano s samim seboj z razmerjem "predloži" (EmplReportsTo). EmplReportsTo je ime razmerja.
Robna miza (EDGE) ima lahko tudi atribute.
Ustvarite tabelo vozlišč EmpNode
Sintaksa za ustvarjanje vozlišča je precej preprosta: do izraza USTVARI TABELO dodano na konec KOT VOZLIŠČE.
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Zdaj pa pretvorimo podatke iz navadne tabele v grafično. Naslednji INSERT vstavi podatke iz relacijske tabele EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
V tabeli vozlišč v posebnem stolpcu $node_id_*
ID gostitelja je shranjen kot JSON. Preostali stolpci te tabele vsebujejo atribute vozlišča.
Ustvari robove (EDGE)
Ustvarjanje robne tabele je zelo podobno ustvarjanju vozliščne tabele, razen ključne besede KOT ROB.
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Zdaj pa definirajmo odnose med zaposlenimi s pomočjo stolpcev EMPNO и M.G.R.. Organizacijska shema jasno kaže, 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);
Robna tabela ima privzeto tri stolpce. Prvič, $edge_id
— identifikator roba v obliki JSON. Druga dva ($from_id
и $to_id
) predstavljajo razmerje med vozlišči. Poleg tega imajo lahko robovi dodatne lastnosti. V našem primeru to Deptno.
Sistemski pogledi
V sistemskem pogledu sys.tables
Obstajata dva nova stolpca:
- je_rob
- je_vozlišče
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Objekti, povezani z grafi, se nahajajo v mapi Tabele grafov. Ikona tabele vozlišč je označena s piko, ikona tabele robov pa je označena z dvema povezanima krogcema (kar izgleda kot očala).
izraz MATCH
Izraz MATCH povzeto iz CQL (Cypher Query Language). To je učinkovit način za poizvedovanje o lastnostih grafa. CQL se začne z 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
Primeri
Poglejmo si nekaj primerov.
Spodnja poizvedba prikazuje zaposlene, ki jim poročata Smith in njegov vodja.
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'
Naslednja poizvedba je namenjena iskanju zaposlenih in vodij druge stopnje za Smith. Če odstranite ponudbo KJE, potem bodo kot rezultat prikazani vsi zaposleni.
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'
In na koncu še zahteva za zaposlene in vodje tretje stopnje.
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'
Zdaj pa spremenimo smer, da dobimo Smithove šefe.
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ček
SQL Server 2017 se je uveljavil kot popolna poslovna rešitev za različne poslovne IT potrebe. Prva različica SQL Graph je zelo obetavna. Kljub nekaterim omejitvam je že dovolj funkcionalnosti za raziskovanje možnosti grafov.
Funkcionalnost SQL Graph je popolnoma integrirana v SQL Engine. Vendar, kot že omenjeno, ima SQL Server 2017 naslednje omejitve:
Ni podpore za polimorfizem.
- Podprte so samo enosmerne povezave.
- Robovi ne morejo posodobiti svojih stolpcev $from_id in $to_id prek UPDATE.
- Prehodna zapiranja niso podprta, vendar jih je mogoče pridobiti s CTE.
- Omejena podpora za objekte OLTP v pomnilniku.
- Začasne tabele (System-Versioned Temporal Table), začasne lokalne in globalne tabele niso podprte.
- Tipov tabel in spremenljivk tabel ni mogoče deklarirati kot NODE ali EDGE.
- Poizvedbe med bazami podatkov niso podprte.
- Ne obstaja neposreden način ali nekakšen čarovnik (čarovnik) za pretvorbo običajnih tabel v grafične tabele.
- Za prikaz grafov ni grafičnega uporabniškega vmesnika, lahko pa uporabite Power BI.
Preberi več:
Vir: www.habr.com