Panimula sa SQL Server 2017 Graph Database

Bago magsimula ang kurso "Developer ng MS SQL Server" Naghanda kami ng isa pang kapaki-pakinabang na pagsasalin para sa iyo.

Ang mga database ng graph ay isang mahalagang teknolohiya para sa mga propesyonal sa database. Sinusubukan kong sundin ang mga inobasyon at mga bagong teknolohiya sa lugar na ito at pagkatapos magtrabaho sa mga database ng relational at NoSQL, nakikita ko na ang papel ng mga database ng graph ay parami nang parami. Kapag nagtatrabaho sa kumplikadong hierarchical data, hindi lamang ang mga tradisyonal na database, kundi pati na rin ang NoSQL ay hindi epektibo. Kadalasan, na may pagtaas sa bilang ng mga antas ng link at ang laki ng database, mayroong pagbaba sa pagganap. At habang nagiging mas kumplikado ang mga relasyon, tumataas din ang bilang ng mga JOIN.

Siyempre, sa relational na modelo ay may mga solusyon para sa pagtatrabaho sa mga hierarchy (halimbawa, gamit ang mga recursive CTE), ngunit ito ay mga workaround pa rin. Kasabay nito, pinapadali ng functionality ng SQL Server graph database ang paghawak ng maramihang antas ng hierarchy. Parehong ang modelo ng data at mga query ay pinasimple, at samakatuwid ang kanilang kahusayan ay tumaas. Makabuluhang binabawasan ang dami ng code.

Ang mga database ng graph ay isang nagpapahayag na wika para sa kumakatawan sa mga kumplikadong sistema. Ang teknolohiyang ito ay medyo malawak na ginagamit sa industriya ng IT sa mga lugar tulad ng mga social network, mga anti-fraud system, pagsusuri sa network ng IT, mga rekomendasyong panlipunan, mga rekomendasyon sa produkto at nilalaman.

Ang graph database functionality sa SQL Server ay angkop para sa mga sitwasyon kung saan ang data ay lubos na magkakaugnay at may mahusay na tinukoy na mga relasyon.

Modelo ng data ng graph

Ang graph ay isang hanay ng mga vertices (node, node) at mga gilid (relasyon, gilid). Ang mga vertice ay kumakatawan sa mga entity, at ang mga gilid ay kumakatawan sa mga link na ang mga katangian ay maaaring maglaman ng impormasyon.

Ang isang graph database ay nagmomodelo ng mga entity bilang isang graph gaya ng tinukoy sa teorya ng graph. Ang mga istruktura ng data ay mga vertex at mga gilid. Ang mga katangian ay mga katangian ng mga vertex at mga gilid. Ang isang koneksyon ay isang koneksyon ng mga vertex.

Hindi tulad ng ibang mga modelo ng data, ang mga database ng graph ay inuuna ang mga ugnayan sa pagitan ng mga entity. Samakatuwid, hindi na kailangang kalkulahin ang mga relasyon gamit ang mga dayuhang key o sa ibang paraan. Posibleng gumawa ng mga kumplikadong modelo ng data gamit lamang ang vertex at edge abstraction.

Sa mundo ngayon, ang pagmomodelo ng mga relasyon ay nangangailangan ng higit at mas sopistikadong mga diskarte. Upang magmodelo ng mga relasyon, nag-aalok ang SQL Server 2017 ng mga kakayahan sa database ng graph. Ang mga vertice at gilid ng graph ay kinakatawan bilang mga bagong uri ng mga talahanayan: NODE at EDGE. Gumagamit ang mga query sa graph ng bagong T-SQL function na tinatawag na MATCH(). Dahil ang functionality na ito ay binuo sa SQL Server 2017, maaari itong magamit sa iyong mga umiiral nang database nang hindi nangangailangan ng anumang conversion ng database.

Mga Benepisyo ng Graph Model

Sa ngayon, ang mga negosyo at user ay humihiling ng mga application na gumagana nang higit pa at mas maraming data, habang umaasa sa mataas na pagganap at pagiging maaasahan. Ang representasyon ng graph ng data ay nag-aalok ng isang maginhawang paraan para sa paghawak ng mga kumplikadong relasyon. Nilulutas ng diskarteng ito ang maraming problema at nakakatulong na makakuha ng mga resulta sa loob ng isang partikular na konteksto.

Mukhang maraming application ang makikinabang sa mga database ng graph sa hinaharap.

Pagmomodelo ng Data: Mula sa Relational hanggang sa Pagmomodelo ng Graph

Panimula sa SQL Server 2017 Graph Database
Halimbawa

Tingnan natin ang isang halimbawa ng istruktura ng organisasyon na may hierarchy ng mga empleyado: nag-uulat ang isang empleyado sa isang manager, nag-uulat ang isang manager sa isang senior manager, at iba pa. Depende sa partikular na kumpanya, maaaring mayroong anumang bilang ng mga antas sa hierarchy na ito. Ngunit habang tumataas ang bilang ng mga antas, nagiging mas mahirap ang pagkalkula ng mga relasyon sa isang relational database. Medyo mahirap isipin ang hierarchy ng mga empleyado, ang hierarchy sa marketing o mga koneksyon sa social media. Tingnan natin kung paano malulutas ng SQL Graph ang problema sa paghawak ng iba't ibang antas ng hierarchy.

Para sa halimbawang ito, gumawa tayo ng isang simpleng modelo ng data. Gumawa ng talahanayan ng mga empleyado EMP may id EMPNO at kolum M.G.R.A na tumuturo sa ID ng pinuno (manager) ng empleyado. Ang lahat ng impormasyon tungkol sa hierarchy ay naka-imbak sa talahanayang ito at maaaring i-query gamit ang mga column EMPNO ΠΈ M.G.R..

Panimula sa SQL Server 2017 Graph Database
Ipinapakita rin ng sumusunod na diagram ang parehong modelo ng org chart na may apat na antas ng nesting sa mas pamilyar na anyo. Ang mga empleyado ay ang mga vertex ng graph mula sa talahanayan EMP. Ang entity na "empleyado" ay naka-link sa sarili nito sa pamamagitan ng relasyong "nagsusumite" (ReportsTo). Sa mga termino ng graph, ang isang link ay isang gilid (EDGE) na nag-uugnay sa mga node (NODE) ​​ng mga empleyado.

Panimula sa SQL Server 2017 Graph Database

Gumawa tayo ng isang regular na talahanayan EMP at magdagdag ng mga halaga doon ayon sa diagram sa itaas.

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)

Ang figure sa ibaba ay nagpapakita ng mga empleyado:

  • empleyado na may EMPNO Ang 7369 ay nasa ilalim ng 7902;
  • empleyado na may EMPNO 7902 subordinate sa 7566
  • empleyado na may EMPNO 7566 subordinate sa 7839

Panimula sa SQL Server 2017 Graph Database
Ngayon tingnan natin ang representasyon ng parehong data sa anyo ng isang graph. Ang EMPLOYEE node ay may ilang mga katangian at naka-link sa sarili nito sa pamamagitan ng isang "nagsusumite" na relasyon (EmplReportsTo). EmplReportsTo ang pangalan ng relasyon.

Ang edge table (EDGE) ay maaari ding may mga katangian.

Panimula sa SQL Server 2017 Graph Database
Gumawa ng node table na EmpNode

Ang syntax para sa paglikha ng isang node ay medyo simple: sa expression GUMAWA NG TABLE idinagdag sa dulo BILANG 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;

Ngayon, i-convert natin ang data mula sa isang regular na talahanayan sa isang graph. Susunod INSERT naglalagay ng data mula sa isang relational table EMP.

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

Panimula sa SQL Server 2017 Graph Database
Sa node table sa isang espesyal na column $node_id_* ang host ID ay naka-store bilang JSON. Ang natitirang mga column ng talahanayang ito ay naglalaman ng mga katangian ng node.

Lumikha ng Mga Edge (EDGE)

Ang paggawa ng edge table ay halos kapareho sa paggawa ng node table, maliban sa keyword BILANG EDGE.

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Panimula sa SQL Server 2017 Graph Database

Ngayon, tukuyin natin ang mga ugnayan sa pagitan ng mga empleyado gamit ang mga column EMPNO ΠΈ M.G.R.. Malinaw na ipinapakita ng org chart kung paano magsulat 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);

Ang edge table ay may tatlong column bilang default. Una, $edge_id β€” edge identifier sa anyo ng JSON. Ang dalawa pa ($from_id ΠΈ $to_id) kumakatawan sa ugnayan sa pagitan ng mga node. Bilang karagdagan, ang mga gilid ay maaaring magkaroon ng mga karagdagang katangian. Sa aming kaso, ito Ang Deptno.

Mga Pagtingin sa System

Sa view ng system sys.tables May dalawang bagong column:

  1. is_edge
  2. is_node

SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'

Panimula sa SQL Server 2017 Graph Database

ssms

Ang mga bagay na nauugnay sa mga graph ay matatagpuan sa folder ng Graph Tables. Ang icon ng talahanayan ng node ay minarkahan ng isang tuldok, at ang icon ng talahanayan sa gilid ay minarkahan ng dalawang magkadugtong na bilog (na medyo parang salamin).

Panimula sa SQL Server 2017 Graph Database

MATCH expression

Pagpapahayag MATCH kinuha mula sa CQL (Cypher Query Language). Ito ay isang mahusay na paraan upang i-query ang mga katangian ng isang graph. Nagsisimula ang CQL sa isang expression MATCH.

palaugnayan

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

Mga halimbawa

Tingnan natin ang ilang halimbawa.

Ang query sa ibaba ay nagpapakita ng mga empleyadong inuulat ni Smith at ng kanyang manager.

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'

Panimula sa SQL Server 2017 Graph Database
Ang sumusunod na query ay para sa paghahanap ng mga empleyado at pangalawang antas ng mga tagapamahala para kay Smith. Kung aalisin mo ang alok SAAN, pagkatapos ay ipapakita ang lahat ng empleyado bilang resulta.

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'

Panimula sa SQL Server 2017 Graph Database
At panghuli, isang kahilingan para sa mga empleyado at tagapamahala ng ikatlong antas.

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'

Panimula sa SQL Server 2017 Graph Database
Ngayon ay baguhin natin ang direksyon upang makuha ang mga amo ni Smith.

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)

Panimula sa SQL Server 2017 Graph Database

Konklusyon

Itinatag ng SQL Server 2017 ang sarili bilang isang kumpletong solusyon sa negosyo para sa iba't ibang pangangailangan sa IT ng negosyo. Ang unang bersyon ng SQL Graph ay napaka-promising. Kahit na sa kabila ng ilang mga limitasyon, mayroon nang sapat na functionality upang galugarin ang mga posibilidad ng mga graph.

Ang functionality ng SQL Graph ay ganap na isinama sa SQL Engine. Gayunpaman, tulad ng nabanggit na, ang SQL Server 2017 ay may mga sumusunod na limitasyon:

Walang suporta para sa polymorphism.

  • Mga unidirectional link lang ang sinusuportahan.
  • Hindi ma-update ng mga gilid ang kanilang mga column na $from_id at $to_id sa pamamagitan ng UPDATE.
  • Hindi sinusuportahan ang mga palipat-lipat na pagsasara, ngunit maaaring makuha ang mga ito gamit ang mga CTE.
  • Limitadong suporta para sa mga In-Memory OLTP na bagay.
  • Ang mga temporal na talahanayan (System-Versioned Temporal Table), pansamantalang lokal at pandaigdigang talahanayan ay hindi suportado.
  • Ang mga uri ng talahanayan at mga variable ng talahanayan ay hindi maaaring ideklara bilang NODE o EDGE.
  • Hindi sinusuportahan ang mga cross-database na query.
  • Walang direktang paraan o ilang uri ng wizard (wizard) para i-convert ang mga regular na table sa mga graph table.
  • Walang GUI na magpapakita ng mga graph, ngunit maaaring gamitin ang Power BI.

Panimula sa SQL Server 2017 Graph Database

Magbasa pa:

Pinagmulan: www.habr.com

Magdagdag ng komento