కోర్సు ప్రారంభానికి ముందు
డేటాబేస్ నిపుణుల కోసం గ్రాఫ్ డేటాబేస్లు ముఖ్యమైన సాంకేతికత. నేను ఈ ప్రాంతంలో ఆవిష్కరణలు మరియు కొత్త సాంకేతికతలను కొనసాగించడానికి ప్రయత్నిస్తాను మరియు రిలేషనల్ మరియు NoSQL డేటాబేస్లతో పనిచేసిన తర్వాత, గ్రాఫ్ డేటాబేస్ల పాత్ర చాలా ముఖ్యమైనదిగా మారిందని నేను చూస్తున్నాను. సంక్లిష్ట క్రమానుగత డేటాతో పని చేస్తున్నప్పుడు, సాంప్రదాయ డేటాబేస్లు మాత్రమే పనికిరావు, కానీ NoSQL కూడా. తరచుగా, కనెక్షన్ స్థాయిల సంఖ్య మరియు డేటాబేస్ పరిమాణం పెరిగేకొద్దీ, పనితీరు తగ్గుతుంది. మరియు సంబంధాలు మరింత క్లిష్టంగా మారడంతో, JOINల సంఖ్య కూడా పెరుగుతుంది.
వాస్తవానికి, రిలేషనల్ మోడల్లో సోపానక్రమాలతో పనిచేయడానికి పరిష్కారాలు ఉన్నాయి (ఉదాహరణకు, పునరావృత CTEలను ఉపయోగించడం), అయితే ఇవి ఇప్పటికీ పరిష్కారాలు. అదే సమయంలో, SQL సర్వర్ గ్రాఫ్ డేటాబేస్ల ఫంక్షనాలిటీ బహుళ స్థాయిల సోపానక్రమాన్ని సులభంగా నిర్వహించడానికి మిమ్మల్ని అనుమతిస్తుంది. డేటా మోడల్ మరియు ప్రశ్నలు రెండూ సరళీకృతం చేయబడ్డాయి మరియు అందువల్ల వాటి సామర్థ్యం పెరుగుతుంది. కోడ్ మొత్తం గణనీయంగా తగ్గింది.
గ్రాఫ్ డేటాబేస్లు సంక్లిష్ట వ్యవస్థలను సూచించడానికి ఒక వ్యక్తీకరణ భాష. ఈ సాంకేతికత ఇప్పటికే IT పరిశ్రమలో సోషల్ నెట్వర్క్లు, యాంటీ-ఫ్రాడ్ సిస్టమ్లు, IT నెట్వర్క్ విశ్లేషణ, సామాజిక సిఫార్సులు, ఉత్పత్తి మరియు కంటెంట్ సిఫార్సుల వంటి రంగాలలో విస్తృతంగా ఉపయోగించబడుతోంది.
SQL సర్వర్లోని గ్రాఫ్ డేటాబేస్ ఫంక్షనాలిటీ అనేది డేటా అత్యంత పరస్పరం అనుసంధానించబడిన మరియు చక్కగా నిర్వచించబడిన సంబంధాలను కలిగి ఉన్న దృశ్యాలకు అనుకూలంగా ఉంటుంది.
గ్రాఫ్ డేటా మోడల్
గ్రాఫ్ అనేది శీర్షాల (నోడ్లు) మరియు అంచుల (సంబంధాలు, అంచు) సమితి. శీర్షాలు ఎంటిటీలను సూచిస్తాయి మరియు అంచులు సమాచారాన్ని కలిగి ఉండే గుణాలను సూచిస్తాయి.
గ్రాఫ్ డేటాబేస్ గ్రాఫ్ సిద్ధాంతంలో నిర్వచించిన విధంగా గ్రాఫ్గా ఎంటిటీలను మోడల్ చేస్తుంది. డేటా నిర్మాణాలు శీర్షాలు మరియు అంచులు. గుణాలు శీర్షాలు మరియు అంచుల లక్షణాలు. కనెక్షన్ అనేది శీర్షాల అనుసంధానం.
ఇతర డేటా మోడల్ల మాదిరిగా కాకుండా, గ్రాఫ్ డేటాబేస్లు ఎంటిటీల మధ్య సంబంధాలకు ప్రాధాన్యత ఇస్తాయి. అందువల్ల, విదేశీ కీలు లేదా ఇతర మార్గాలను ఉపయోగించి సంబంధాలను లెక్కించాల్సిన అవసరం లేదు. శీర్షం మరియు అంచు సంగ్రహాలను మాత్రమే ఉపయోగించి సంక్లిష్ట డేటా నమూనాలను సృష్టించడం సాధ్యమవుతుంది.
ఆధునిక ప్రపంచంలో, మోడలింగ్ సంబంధాలకు సంక్లిష్టమైన సాంకేతికతలు అవసరం. మోడల్ సంబంధాల కోసం, SQL సర్వర్ 2017 గ్రాఫ్ డేటాబేస్ సామర్థ్యాలను అందిస్తుంది. గ్రాఫ్ యొక్క శీర్షాలు మరియు అంచులు కొత్త రకాల పట్టికలుగా సూచించబడతాయి: NODE మరియు EDGE. గ్రాఫ్ ప్రశ్నలు MATCH() అనే కొత్త T-SQL ఫంక్షన్ను ఉపయోగిస్తాయి. ఈ కార్యాచరణ SQL సర్వర్ 2017లో నిర్మించబడినందున, ఇది మీ ప్రస్తుత డేటాబేస్లలో ఎలాంటి మార్పిడి అవసరం లేకుండా ఉపయోగించబడుతుంది.
గ్రాఫ్ మోడల్ యొక్క ప్రయోజనాలు
నేడు, వ్యాపారాలు మరియు వినియోగదారులు అధిక పనితీరు మరియు విశ్వసనీయతను ఆశించేటప్పుడు మరింత ఎక్కువ డేటాను నిర్వహించే అప్లికేషన్లను డిమాండ్ చేస్తున్నారు. డేటాను గ్రాఫ్గా సూచించడం సంక్లిష్ట సంబంధాలను నిర్వహించడానికి అనుకూలమైన మార్గాలను అందిస్తుంది. ఈ విధానం అనేక సమస్యలను పరిష్కరిస్తుంది మరియు ఇచ్చిన సందర్భంలో ఫలితాలను పొందడంలో సహాయపడుతుంది.
భవిష్యత్తులో గ్రాఫ్ డేటాబేస్లను ఉపయోగించడం వల్ల అనేక అప్లికేషన్లు ప్రయోజనం పొందుతున్నట్లు కనిపిస్తోంది.
డేటా మోడలింగ్: రిలేషనల్ నుండి గ్రాఫ్ మోడల్ వరకు
ఉదాహరణకు
ఉద్యోగుల సోపానక్రమంతో కూడిన సంస్థాగత నిర్మాణం యొక్క ఉదాహరణను చూద్దాం: ఒక ఉద్యోగి మేనేజర్కు నివేదిస్తాడు, మేనేజర్ సీనియర్ మేనేజర్కి నివేదిస్తాడు మరియు మొదలైనవి. నిర్దిష్ట కంపెనీపై ఆధారపడి, ఈ సోపానక్రమంలో ఎన్ని స్థాయిలు ఉండవచ్చు. కానీ స్థాయిల సంఖ్య పెరిగేకొద్దీ, రిలేషనల్ డేటాబేస్లో సంబంధాలను లెక్కించడం మరింత కష్టమవుతుంది. ఉద్యోగుల సోపానక్రమం, మార్కెటింగ్లో సోపానక్రమం లేదా సోషల్ నెట్వర్క్లలోని కనెక్షన్లను ఊహించడం చాలా కష్టం. SQL గ్రాఫ్ వివిధ స్థాయిల సోపానక్రమాన్ని నిర్వహించే సమస్యను ఎలా పరిష్కరిస్తుందో చూద్దాం.
ఈ ఉదాహరణ కోసం మేము సాధారణ డేటా మోడల్ను తయారు చేస్తాము. ఉద్యోగుల పట్టికను రూపొందిద్దాం EMP ID తో EMPNO మరియు కాలమ్ ఎంజీఆర్, ఉద్యోగి యొక్క సూపర్వైజర్ (మేనేజర్) యొక్క ఐడెంటిఫైయర్ను సూచిస్తుంది. సోపానక్రమం గురించిన మొత్తం సమాచారం ఈ పట్టికలో నిల్వ చేయబడుతుంది మరియు నిలువు వరుసలను ఉపయోగించి ప్రశ్నించవచ్చు EMPNO и ఎంజీఆర్.
కింది రేఖాచిత్రం అదే సంస్థాగత నిర్మాణ నమూనాను నాలుగు స్థాయిల గూడుతో మరింత సుపరిచితమైన రూపంలో చూపుతుంది. ఉద్యోగులు టేబుల్ నుండి గ్రాఫ్ యొక్క శీర్షాలు EMP. ఎంటిటీ "ఉద్యోగి" కనెక్షన్ "సమర్పిస్తుంది" (ReportsTo) ద్వారా దానితో అనుసంధానించబడి ఉంది. గ్రాఫ్ పరంగా, లింక్ అనేది ఉద్యోగుల నోడ్లను (NODE) కనెక్ట్ చేసే అంచు (EDGE).
సాధారణ పట్టికను క్రియేట్ చేద్దాం EMP మరియు పై రేఖాచిత్రానికి అనుగుణంగా అక్కడ విలువలను జోడించండి.
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)
దిగువ చిత్రం ఉద్యోగులను చూపుతుంది:
- తో ఉద్యోగి EMPNO 7369 కట్టుబడి 7902;
- తో ఉద్యోగి EMPNO 7902 7566కు కట్టుబడి ఉంది
- తో ఉద్యోగి EMPNO 7566 7839కు కట్టుబడి ఉంది
ఇప్పుడు అదే డేటా యొక్క గ్రాఫ్ ప్రాతినిధ్యాన్ని చూద్దాం. EMPLOYEE శీర్షం అనేక లక్షణాలను కలిగి ఉంది మరియు "సబార్డినేట్స్" సంబంధం (EmplReportsTo) ద్వారా దానితో అనుసంధానించబడి ఉంది. EmplReportsTo అనేది సంబంధం పేరు.
అంచు పట్టిక (EDGE) కూడా లక్షణాలను కలిగి ఉండవచ్చు.
నోడ్ టేబుల్ ఎంప్నోడ్ని క్రియేట్ చేద్దాం
నోడ్ను రూపొందించడానికి వాక్యనిర్మాణం చాలా సులభం: వ్యక్తీకరణకు పట్టికను సృష్టించండి ముగింపుకు జోడించబడుతుంది "నోడ్ వలె".
CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;
ఇప్పుడు డేటాను సాధారణ పట్టిక నుండి గ్రాఫ్గా మారుద్దాం. తరువాత ఇన్సర్ట్ రిలేషనల్ టేబుల్ నుండి డేటాను ఇన్సర్ట్ చేస్తుంది EMP.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
ప్రత్యేక కాలమ్లోని నోడ్ల పట్టికలో $node_id_*
నోడ్ ఐడెంటిఫైయర్ JSONగా నిల్వ చేయబడుతుంది. ఈ పట్టిక యొక్క మిగిలిన నిలువు వరుసలు నోడ్ యొక్క లక్షణాలను కలిగి ఉంటాయి.
అంచులను సృష్టిస్తోంది (EDGE)
ఎడ్జ్ టేబుల్ని సృష్టించడం అనేది నోడ్ టేబుల్ని సృష్టించడం లాంటిది, కీవర్డ్ని ఉపయోగించడం తప్ప "అంచుగా".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
ఇప్పుడు నిలువు వరుసలను ఉపయోగించి ఉద్యోగుల మధ్య కనెక్షన్లను నిర్వచిద్దాం EMPNO и ఎంజీఆర్. సంస్థాగత నిర్మాణ రేఖాచిత్రం ఎలా వ్రాయాలో స్పష్టంగా చూపిస్తుంది ఇన్సర్ట్.
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);
డిఫాల్ట్ అంచు పట్టిక మూడు నిలువు వరుసలను కలిగి ఉంటుంది. ప్రధమ, $edge_id
— JSON రూపంలో అంచు ఐడెంటిఫైయర్. మిగిలిన రెండు ($from_id
и $to_id
) నోడ్ల మధ్య కనెక్షన్ని సూచిస్తుంది. అదనంగా, అంచులు అదనపు లక్షణాలను కలిగి ఉంటాయి. మా విషయంలో అది శాఖ.
సిస్టమ్ వీక్షణలు
సిస్టమ్ వీక్షణలో sys.tables
రెండు కొత్త నిలువు వరుసలు కనిపించాయి:
- అంచు
- ఉంది_నోడ్
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
గ్రాఫ్లకు సంబంధించిన వస్తువులు గ్రాఫ్ టేబుల్స్ ఫోల్డర్లో ఉన్నాయి. నోడ్ టేబుల్ చిహ్నం చుక్కతో గుర్తించబడింది మరియు అంచు పట్టిక చిహ్నం రెండు కనెక్ట్ చేయబడిన సర్కిల్లతో (కొంచెం గ్లాసెస్ లాగా) గుర్తించబడింది.
MATCH వ్యక్తీకరణ
వ్యక్తీకరణ MATCH CQL (సైఫర్ క్వెరీ లాంగ్వేజ్) నుండి తీసుకోబడింది. గ్రాఫ్ యొక్క లక్షణాలను ప్రశ్నించడానికి ఇది సమర్థవంతమైన మార్గం. CQL వ్యక్తీకరణతో ప్రారంభమవుతుంది MATCH.
వాక్యనిర్మాణం
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
ఉదాహరణలు
కొన్ని ఉదాహరణలు చూద్దాం.
దిగువ ప్రశ్న స్మిత్ మరియు అతని మేనేజర్ రిపోర్ట్ చేసే ఉద్యోగులను ప్రదర్శిస్తుంది.
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'
స్మిత్ కోసం రెండవ-స్థాయి ఉద్యోగులు మరియు నిర్వాహకులను కనుగొనడం కోసం క్రింది ప్రశ్న. మీరు వాక్యాన్ని తీసివేస్తే ఎక్కడ, అప్పుడు ఫలితం మొత్తం ఉద్యోగులను ప్రదర్శిస్తుంది.
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'
చివరకు, మూడవ స్థాయి ఉద్యోగులు మరియు నిర్వాహకుల కోసం ఒక అభ్యర్థన.
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'
ఇప్పుడు స్మిత్ బాస్లను పొందడానికి దిశను మారుద్దాం.
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)
తీర్మానం
SQL సర్వర్ 2017 వివిధ IT వ్యాపార పనుల కోసం పూర్తి సంస్థ పరిష్కారంగా స్థిరపడింది. SQL గ్రాఫ్ యొక్క మొదటి వెర్షన్ చాలా ఆశాజనకంగా ఉంది. కొన్ని పరిమితులు ఉన్నప్పటికీ, గ్రాఫ్ల సామర్థ్యాలను అన్వేషించడానికి ఇప్పటికే తగినంత కార్యాచరణ ఉంది.
SQL గ్రాఫ్ ఫంక్షనాలిటీ పూర్తిగా SQL ఇంజిన్లో విలీనం చేయబడింది. అయితే, ఇప్పటికే చెప్పినట్లుగా, SQL సర్వర్ 2017 కింది పరిమితులను కలిగి ఉంది:
పాలిమార్ఫిజం మద్దతు లేదు.
- ఏకదిశాత్మక కనెక్షన్లకు మాత్రమే మద్దతు ఉంది.
- అంచులు UPDATE ద్వారా $from_id మరియు $to_id నిలువు వరుసలను నవీకరించలేవు.
- ట్రాన్సిటివ్ మూసివేతలకు మద్దతు లేదు, కానీ వాటిని CTEని ఉపయోగించి పొందవచ్చు.
- ఇన్-మెమరీ OLTP ఆబ్జెక్ట్లకు మద్దతు పరిమితం చేయబడింది.
- తాత్కాలిక పట్టికలు (సిస్టమ్-వెర్షన్డ్ టెంపోరల్ టేబుల్), తాత్కాలిక స్థానిక మరియు ప్రపంచ పట్టికలకు మద్దతు లేదు.
- టేబుల్ రకాలు మరియు టేబుల్ వేరియబుల్స్ NODE లేదా EDGEగా ప్రకటించబడవు.
- క్రాస్-డేటాబేస్ ప్రశ్నలకు మద్దతు లేదు.
- సాధారణ పట్టికలను గ్రాఫ్ పట్టికలుగా మార్చడానికి ప్రత్యక్ష మార్గం లేదా విజర్డ్ లేదు.
- గ్రాఫ్లను ప్రదర్శించడానికి GUI లేదు, కానీ మీరు పవర్ BIని ఉపయోగించవచ్చు.
ఇంకా చదవండి:
మూలం: www.habr.com