Áður en námskeiðið hefst
Línuritsgagnagrunnar eru mikilvæg tækni fyrir fagfólk í gagnagrunnum. Ég reyni að fylgjast með nýjungum og nýrri tækni á þessu sviði og eftir að hafa unnið með tengsla- og NoSQL gagnagrunna sé ég hlutverk línuritagagnagrunna verða sífellt mikilvægari. Þegar unnið er með flókin stigveldisgögn eru ekki aðeins hefðbundnir gagnagrunnar óvirkir heldur einnig NoSQL. Oft, eftir því sem fjöldi tengistiga og stærð gagnagrunnsins eykst, minnkar árangur. Og eftir því sem samböndin verða flóknari eykst fjöldi JOINs líka.
Auðvitað hefur venslalíkanið lausnir til að vinna með stigveldi (til dæmis að nota endurkvæma CTE), en þetta eru samt lausnir. Á sama tíma gerir virkni SQL Server grafgagnagrunna þér kleift að höndla mörg stig stigveldis auðveldlega. Bæði gagnalíkanið og fyrirspurnir eru einfaldaðar og því eykst skilvirkni þeirra. Magn kóðans minnkar verulega.
Grafgagnagrunnar eru tjáningarmikið tungumál til að tákna flókin kerfi. Þessi tækni er nú þegar nokkuð mikið notuð í upplýsingatækniiðnaðinum á sviðum eins og samfélagsnetum, svikavarnakerfi, greiningu upplýsingatæknineta, félagslegum ráðleggingum, ráðleggingum um vörur og efni.
Virkni línuritagagnagrunnsins í SQL Server hentar fyrir aðstæður þar sem gögn eru mjög samtengd og hafa vel skilgreind tengsl.
Grafgagnalíkan
Línurit er safn hornpunkta (hnúta) og brúna (tengsl, brún). Vertices tákna einingar og brúnir tákna tengsl þar sem eiginleikar geta innihaldið upplýsingar.
Línuritagagnagrunnur líkir einingar sem línurit eins og skilgreint er í línuritafræði. Gagnabyggingar eru hornpunktar og brúnir. Eiginleikar eru eiginleikar hornpunkta og brúna. Tenging er tenging hornpunkta.
Ólíkt öðrum gagnalíkönum forgangsraða línuritsgagnagrunnar samböndum milli eininga. Þess vegna er engin þörf á að reikna út tengsl með erlendum lyklum eða öðrum hætti. Það er hægt að búa til flókin gagnalíkön með því að nota aðeins hornpunkt og brún abstrakt.
Í nútíma heimi krefjast líkansambönd sífellt flóknari tækni. Til að búa til sambönd, býður SQL Server 2017 upp á grafgagnagrunnsgetu. Hnútar og brúnir grafsins eru sýndar sem nýjar gerðir af töflum: NODE og EDGE. Línuritafyrirspurnir nota nýtt T-SQL fall sem kallast MATCH(). Þar sem þessi virkni er innbyggð í SQL Server 2017 er hægt að nota hana í núverandi gagnagrunnum þínum án þess að þurfa að breyta.
Kostir graflíkansins
Í dag krefjast fyrirtæki og notendur forrita sem meðhöndla sífellt fleiri gögn, en búast við mikilli afköstum og áreiðanleika. Að sýna gögn sem línurit býður upp á þægilega leið til að meðhöndla flókin tengsl. Þessi nálgun leysir mörg vandamál og hjálpar til við að fá niðurstöður í tilteknu samhengi.
Það lítur út fyrir að mörg forrit muni njóta góðs af því að nota grafgagnagrunna í framtíðinni.
Gagnalíkan: frá tengslalíkani yfir í línuritslíkan
Dæmi
Lítum á dæmi um skipulag með stigveldi starfsmanna: starfsmaður heyrir undir stjórnanda, yfirmaður heyrir undir yfirstjórn o.s.frv. Það fer eftir tilteknu fyrirtæki, það getur verið hvaða fjöldi stiga sem er í þessu stigveldi. En eftir því sem stigunum fjölgar verður sífellt erfiðara að reikna tengsl í tengslagagnagrunni. Það er frekar erfitt að ímynda sér stigveldi starfsmanna, stigveldi í markaðssetningu eða tengsl á samfélagsnetum. Við skulum sjá hvernig SQL Graph getur leyst vandamálið við að meðhöndla mismunandi stig stigveldis.
Fyrir þetta dæmi munum við búa til einfalt gagnalíkan. Búum til töflu yfir starfsmenn EMP með skilríki EMPNO og dálkur M.G.R., sem gefur til kynna auðkenni yfirmanns starfsmanns (stjórnanda). Allar upplýsingar um stigveldið eru geymdar í þessari töflu og hægt er að spyrjast fyrir um þær með dálkum EMPNO и M.G.R..
Eftirfarandi skýringarmynd sýnir sama skipulagslíkan með fjórum stigum hreiður í kunnuglegri mynd. Starfsmenn eru hornpunktar á línuriti úr töflu EMP. Einingin „starfsmaður“ er tengdur sjálfum sér með tengingunni „senur“ (ReportsTo). Í línuritsskilmálum er hlekkur brún (EDGE) sem tengir hnúta (NODE) starfsmanna.
Búum til venjulegt borð EMP og bættu við gildunum þar í samræmi við skýringarmyndina hér að ofan.
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)
Meðfylgjandi mynd sýnir starfsmenn:
- starfsmaður með EMPNO 7369 hlýðir 7902;
- starfsmaður með EMPNO 7902 hlýðir 7566
- starfsmaður með EMPNO 7566 hlýðir 7839
Nú skulum við skoða línuritsmynd af sömu gögnum. STARFSpunkturinn hefur nokkra eiginleika og er tengdur sjálfum sér með „undirmönnum“ sambandinu (EmplReportsTo). EmplReportsTo er nafn sambandsins.
Brúntaflan (EDGE) getur einnig innihaldið eiginleika.
Við skulum búa til hnútatöflu EmpNode
Setningafræðin til að búa til hnút er frekar einföld: við tjáninguna BÚA TÖFLU bætist við í lokin "SEM HNÚÐUR".
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
Nú skulum við umbreyta gögnunum úr venjulegri töflu í graftöflu. Næst INSERT setur inn gögn úr venslatöflu EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
Í töflunni yfir hnúta í sérstökum dálki $node_id_*
hnútauðkennið er geymt sem JSON. Eftirstöðvar dálkanna í þessari töflu innihalda eiginleika hnútsins.
Búa til brúnir (EDGE)
Að búa til brúntöflu er mjög svipað og að búa til hnúttöflu, nema að lykilorðið er notað "AS EDGE".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Nú skulum við skilgreina tengingar milli starfsmanna með því að nota dálka EMPNO и M.G.R.. Skipulagsmyndin sýnir greinilega hvernig á að skrifa 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);
Sjálfgefin brúntafla samanstendur af þremur dálkum. Í fyrsta lagi, $edge_id
— brúnaauðkenni á JSON formi. Hinir tveir ($from_id
и $to_id
) tákna tenginguna milli hnúta. Að auki geta brúnir haft fleiri eiginleika. Í okkar tilviki er það Deptnr.
Kerfissýn
Í kerfissýn sys.tables
tveir nýir dálkar hafa birst:
- er_brún
- er_hnútur
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Hlutir sem tengjast línuritum eru staðsettir í möppunni Graph Tables. Hnúttaflatáknið er merkt með punkti og brúnborðstáknið er merkt með tveimur tengdum hringjum (sem lítur svolítið út eins og gleraugu).
MATCH tjáning
Tjáning MATCH tekið úr CQL (Cypher Query Language). Þetta er skilvirk leið til að spyrjast fyrir um eiginleika grafs. CQL byrjar á tjáningu MATCH.
Setningafræði
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
dæmi
Við skulum skoða nokkur dæmi.
Fyrirspurnin hér að neðan sýnir starfsmenn sem Smith og yfirmaður hans tilkynna til.
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'
Eftirfarandi fyrirspurn er til að finna starfsmenn og stjórnendur á öðru stigi fyrir Smith. Ef þú fjarlægir setninguna HVAR, þá mun niðurstaðan sýna alla starfsmenn.
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'
Og að lokum, beiðni um þriðja stigs starfsmenn og stjórnendur.
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ú skulum við breyta um stefnu til að fá yfirmenn 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)
Ályktun
SQL Server 2017 hefur fest sig í sessi sem fullkomin fyrirtækjalausn fyrir ýmis upplýsingatækniviðskipti. Fyrsta útgáfan af SQL Graph lofar mjög góðu. Jafnvel þrátt fyrir nokkrar takmarkanir er nú þegar næg virkni til að kanna getu grafa.
SQL Graph virkni er að fullu samþætt í SQL Engine. Hins vegar, eins og áður hefur komið fram, hefur SQL Server 2017 eftirfarandi takmarkanir:
Enginn stuðningur við fjölbreytileika.
- Aðeins einstefnutengingar eru studdar.
- Edges geta ekki uppfært $from_id og $to_id dálka með UPDATE.
- Tímabundnar lokanir eru ekki studdar, en hægt er að fá þær með CTE.
- Stuðningur við OLTP hluti í minni er takmarkaður.
- Tímabundnar töflur (kerfisútgáfu tímabundnar töflur), tímabundnar staðbundnar og alþjóðlegar töflur eru ekki studdar.
- Ekki er hægt að lýsa töflugerðum og töflubreytum sem NODE eða EDGE.
- Fyrirspurnir í gegnum gagnagrunna eru ekki studdar.
- Það er engin bein leið eða töframaður til að breyta venjulegum töflum í graftöflur.
- Það er ekkert GUI til að birta línurit, en þú getur notað Power BI.
Lestu meira:
Heimild: www.habr.com