Pirms kursa sÄkuma
Grafu datu bÄzes ir svarÄ«ga tehnoloÄ£ija datu bÄzu profesionÄļiem. Es cenÅ”os sekot lÄ«dzi jauninÄjumiem un jaunajÄm tehnoloÄ£ijÄm Å”ajÄ jomÄ, un pÄc darba ar relÄciju un NoSQL datu bÄzÄm es redzu, ka grafu datu bÄzu loma kļūst arvien svarÄ«gÄka. StrÄdÄjot ar sarežģītiem hierarhiskiem datiem, neefektÄ«vas ir ne tikai tradicionÄlÄs datu bÄzes, bet arÄ« NoSQL. Bieži vien, palielinoties savienojuma lÄ«meÅu skaitam un datu bÄzes izmÄram, veiktspÄja samazinÄs. Un, tÄ kÄ attiecÄ«bas kļūst sarežģītÄkas, palielinÄs arÄ« JOIN skaits.
Protams, relÄciju modelim ir risinÄjumi darbam ar hierarhijÄm (piemÄram, izmantojot rekursÄ«vos CTE), taÄu tie joprojÄm ir risinÄjumi. TajÄ paÅ”Ä laikÄ SQL Server grafiku datu bÄzu funkcionalitÄte ļauj viegli apstrÄdÄt vairÄkus hierarhijas lÄ«meÅus. Gan datu modelis, gan vaicÄjumi tiek vienkÄrÅ”oti, un lÄ«dz ar to palielinÄs to efektivitÄte. Koda apjoms ir ievÄrojami samazinÄts.
Grafu datu bÄzes ir izteiksmÄ«ga valoda sarežģītu sistÄmu attÄloÅ”anai. Å Ä« tehnoloÄ£ija jau ir diezgan plaÅ”i izmantota IT nozarÄ tÄdÄs jomÄs kÄ sociÄlie tÄ«kli, krÄpÅ”anas apkaroÅ”anas sistÄmas, IT tÄ«klu analÄ«ze, sociÄlie ieteikumi, produktu un satura ieteikumi.
Grafiku datu bÄzes funkcionalitÄte programmÄ SQL Server ir piemÄrota gadÄ«jumiem, kad dati ir ļoti savstarpÄji saistÄ«ti un tiem ir labi definÄtas attiecÄ«bas.
Grafika datu modelis
Grafs ir virsotÅu (mezglu) un malu (attiecÄ«bu, malu) kopa. Virsotnes apzÄ«mÄ entÄ«tijas, un malas apzÄ«mÄ attiecÄ«bas, kuru atribÅ«ti var saturÄt informÄciju.
Grafu datubÄze modelÄ entÄ«tijas kÄ grafu, kÄ definÄts grafu teorijÄ. Datu struktÅ«ras ir virsotnes un malas. AtribÅ«ti ir virsotÅu un malu Ä«paŔības. Savienojums ir virsotÅu savienojums.
AtŔķirÄ«bÄ no citiem datu modeļiem, grafiku datu bÄzÄs prioritÄtes ir attiecÄ«bÄm starp entÄ«tijÄm. TÄpÄc nav nepiecieÅ”ams aprÄÄ·inÄt attiecÄ«bas, izmantojot ÄrÄjÄs atslÄgas vai citus lÄ«dzekļus. Ir iespÄjams izveidot sarežģītus datu modeļus, izmantojot tikai virsotÅu un malu abstrakcijas.
MÅ«sdienu pasaulÄ attiecÄ«bu modelÄÅ”anai ir vajadzÄ«gas arvien sarežģītÄkas metodes. Lai modelÄtu attiecÄ«bas, SQL Server 2017 piedÄvÄ grafiku datu bÄzes iespÄjas. Grafa virsotnes un malas tiek attÄlotas kÄ jauna veida tabulas: NODE un EDGE. Grafu vaicÄjumi izmanto jaunu T-SQL funkciju, ko sauc par MATCH(). TÄ kÄ Å”Ä« funkcionalitÄte ir iebÅ«vÄta SQL Server 2017, to var izmantot esoÅ”ajÄs datu bÄzÄs bez nepiecieÅ”amÄ«bas veikt pÄrveidoÅ”anu.
Grafika modeļa priekŔrocības
MÅ«sdienÄs uzÅÄmumi un lietotÄji pieprasa lietojumprogrammas, kas apstrÄdÄ arvien vairÄk datu, vienlaikus sagaidot augstu veiktspÄju un uzticamÄ«bu. Datu attÄloÅ”ana grafikÄ piedÄvÄ Ärtu lÄ«dzekli sarežģītu attiecÄ«bu apstrÄdei. Å Ä« pieeja atrisina daudzas problÄmas un palÄ«dz iegÅ«t rezultÄtus noteiktÄ kontekstÄ.
Å Ä·iet, ka daudzas lietojumprogrammas nÄkotnÄ gÅ«s labumu no grafiku datu bÄzu izmantoÅ”anas.
Datu modelÄÅ”ana: no relÄcijas uz grafu modeli
PiemÄrs
ApskatÄ«sim organizÄcijas struktÅ«ras piemÄru ar darbinieku hierarhiju: darbinieks atskaitÄs vadÄ«tÄjam, vadÄ«tÄjs - augstÄkajam vadÄ«tÄjam utt. AtkarÄ«bÄ no konkrÄtÄ uzÅÄmuma Å”ajÄ hierarhijÄ var bÅ«t jebkurÅ” lÄ«meÅu skaits. Bet, palielinoties lÄ«meÅu skaitam, attiecÄ«bu aprÄÄ·inÄÅ”ana relÄciju datu bÄzÄ kļūst arvien grÅ«tÄka. Ir diezgan grÅ«ti iedomÄties darbinieku hierarhiju, hierarhiju mÄrketingÄ vai savienojumus sociÄlajos tÄ«klos. ApskatÄ«sim, kÄ SQL Graph var atrisinÄt dažÄdu hierarhijas lÄ«meÅu apstrÄdes problÄmu.
Å ajÄ piemÄrÄ mÄs izveidosim vienkÄrÅ”u datu modeli. Izveidosim darbinieku tabulu EMP ar ID EMPNO un kolonnu M.G.R., norÄdot darbinieka darba vadÄ«tÄja (vadÄ«tÄja) identifikatoru. Visa informÄcija par hierarhiju tiek glabÄta Å”ajÄ tabulÄ, un to var pieprasÄ«t, izmantojot kolonnas EMPNO Šø M.G.R..
NÄkamajÄ diagrammÄ ir parÄdÄ«ts tas pats organizatoriskÄs struktÅ«ras modelis ar Äetriem ligzdoÅ”anas lÄ«meÅiem pazÄ«stamÄkÄ formÄ. Darbinieki ir diagrammas virsotnes no tabulas EMP. VienÄ«ba ādarbinieksā ir saistÄ«ta ar sevi, izmantojot savienojumu āiesniedzā (ReportsTo). Grafika izteiksmÄ saite ir mala (EDGE), kas savieno darbinieku mezglus (NODE).
Izveidosim parastu tabulu EMP un pievienojiet 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Ä redzami darbinieki:
- darbinieks ar EMPNO 7369 pakļaujas 7902;
- darbinieks ar EMPNO 7902 pakļaujas 7566
- darbinieks ar EMPNO 7566 pakļaujas 7839
Tagad apskatÄ«sim to paÅ”u datu diagrammu. Virsotnei DARBINIEKS ir vairÄki atribÅ«ti, un tÄ ir saistÄ«ta ar sevi ar āpadotoā attiecÄ«bÄm (EmplReportsTo). EmplReportsTo ir attiecÄ«bu nosaukums.
Malu tabulÄ (EDGE) var bÅ«t arÄ« atribÅ«ti.
Izveidosim mezglu tabulu EmpNode
Mezgla izveides sintakse ir pavisam vienkÄrÅ”a: izteiksmei IZVEIDOT GALDA tiek pievienots beigÄs "KÄ 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 konvertÄsim datus no parastÄs tabulas uz grafiku tabulu. NÄkamais INSERT ievieto datus no relÄciju tabulas EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
Mezglu tabulÄ Ä«paÅ”Ä kolonnÄ $node_id_*
mezgla identifikators tiek saglabÄts kÄ JSON. PÄrÄjÄs Ŕīs tabulas kolonnas satur mezgla atribÅ«ti.
Malu veidoŔana (EDGE)
Malu tabulas izveide ir ļoti lÄ«dzÄ«ga mezglu tabulas izveidei, izÅemot to, ka tiek izmantots atslÄgvÄrds "KÄ EDGE".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Tagad definÄsim savienojumus starp darbiniekiem, izmantojot kolonnas EMPNO Šø M.G.R.. OrganizÄcijas struktÅ«ras diagramma skaidri parÄda, kÄ rakstÄ«t 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);
NoklusÄjuma malu tabula sastÄv no trim kolonnÄm. PirmkÄrt, $edge_id
ā malas identifikators JSON formÄtÄ. PÄrÄjie divi ($from_id
Šø $to_id
) attÄlo savienojumu starp mezgliem. TurklÄt malÄm var bÅ«t papildu Ä«paŔības. MÅ«su gadÄ«jumÄ tÄ ir Deptno.
SistÄmas skati
SistÄmas skatÄ sys.tables
ir parÄdÄ«juÅ”Äs divas jaunas kolonnas:
- ir_mala
- ir_mezgls
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Ar grafikiem saistÄ«tie objekti atrodas mapÄ Graph Tables. Mezglu tabulas ikona ir atzÄ«mÄta ar punktu, bet malu tabulas ikona ir atzÄ«mÄta ar diviem savienotiem apļiem (mazliet lÄ«dzÄ«gi brillÄm).
MATCH izteiksme
Izteiksme MATCH Åemts no CQL (Cypher Query Language). Tas ir efektÄ«vs veids, kÄ vaicÄt diagrammas Ä«paŔības. CQL sÄkas ar izteiksmi MATCH.
sintakse
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
piemÄri
ApskatÄ«sim dažus piemÄrus.
TÄlÄk sniegtajÄ vaicÄjumÄ ir parÄdÄ«ti darbinieki, kuriem Smits un viÅa vadÄ«tÄjs ziÅo.
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'
Å is vaicÄjums ir paredzÄts, lai atrastu Smita otrÄ lÄ«meÅa darbiniekus un vadÄ«tÄjus. Ja noÅemat teikumu KUR, tad rezultÄts parÄdÄ«s visus darbiniekus.
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'
Un visbeidzot lÅ«gums treÅ”Ä lÄ«meÅa darbiniekiem un 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'
Tagad mainīsim virzienu, lai iegūtu Smita priekŔniekus.
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)
SecinÄjums
SQL Server 2017 ir sevi pierÄdÄ«jis kÄ pilnÄ«gs uzÅÄmuma risinÄjums dažÄdiem IT biznesa uzdevumiem. PirmÄ SQL Graph versija ir ļoti daudzsoloÅ”a. Pat neskatoties uz dažiem ierobežojumiem, jau ir pietiekami daudz funkcionalitÄtes, lai izpÄtÄ«tu grafiku 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 polimorfisma atbalsta.
- Tiek atbalstīti tikai vienvirziena savienojumi.
- Edges nevar atjauninÄt kolonnas $from_id un $to_id, izmantojot UPDATE.
- TransitÄ«vÄs aizvÄrÅ”anas iespÄjas netiek atbalstÄ«tas, taÄu tÄs var iegÅ«t, izmantojot CTE.
- Atbalsts atmiÅÄ esoÅ”ajiem OLTP objektiem ir ierobežots.
- TemporÄlÄs tabulas (System-Versioned Temporal Table), pagaidu lokÄlÄs un globÄlÄs tabulas netiek atbalstÄ«tas.
- Tabulu veidus un tabulu mainÄ«gos nevar deklarÄt kÄ NODE vai EDGE.
- VairÄku datu bÄzu vaicÄjumi netiek atbalstÄ«ti.
- Nav tieÅ”a veida vai vedÅa, lai parastÄs tabulas pÄrveidotu par grafiku tabulÄm.
- Grafiku attÄloÅ”anai nav GUI, taÄu varat izmantot Power BI.
LasÄ«t vairÄk:
Avots: www.habr.com