Introduktion til grafdatabaser SQL Server 2017

Inden kursusstart "MS SQL Server Developer" Vi har forberedt endnu en nyttig oversættelse til dig.

Grafdatabaser er en vigtig teknologi for databaseprofessionelle. Jeg forsøger at følge med innovationer og nye teknologier på dette område, og efter at have arbejdet med relationelle og NoSQL-databaser ser jeg grafdatabasernes rolle blive stadig vigtigere. Når man arbejder med komplekse hierarkiske data, er ikke kun traditionelle databaser ineffektive, men også NoSQL. Ofte falder ydeevnen efterhånden som antallet af forbindelsesniveauer og størrelsen af ​​databasen øges. Og efterhånden som relationerne bliver mere komplekse, stiger antallet af JOINs også.

Relationsmodellen har selvfølgelig løsninger til at arbejde med hierarkier (for eksempel ved brug af rekursive CTE'er), men disse er stadig løsninger. Samtidig giver funktionaliteten af ​​SQL Server grafdatabaser dig mulighed for nemt at håndtere flere niveauer af hierarki. Både datamodellen og forespørgsler er forenklet, og derfor øges deres effektivitet. Mængden af ​​kode er væsentligt reduceret.

Grafdatabaser er et udtryksfuldt sprog til at repræsentere komplekse systemer. Denne teknologi er allerede meget udbredt i IT-branchen inden for områder som sociale netværk, anti-svindelsystemer, IT-netværksanalyser, sociale anbefalinger, produkt- og indholdsanbefalinger.

Grafdatabasefunktionaliteten i SQL Server er velegnet til scenarier, hvor data er meget indbyrdes forbundet og har veldefinerede relationer.

Grafisk datamodel

En graf er et sæt af hjørner (knuder) og kanter (relationer, kant). Hjørner repræsenterer enheder, og kanter repræsenterer relationer, hvis attributter kan indeholde information.

En grafdatabase modellerer enheder som en graf som defineret i grafteori. Datastrukturer er hjørner og kanter. Attributter er egenskaber ved toppunkter og kanter. En forbindelse er en forbindelse af hjørner.

I modsætning til andre datamodeller prioriterer grafdatabaser relationer mellem enheder. Derfor er der ikke behov for at beregne relationer ved hjælp af fremmednøgler eller andre midler. Det er muligt at skabe komplekse datamodeller ved kun at bruge vertex- og kantabstraktioner.

I den moderne verden kræver modellering af forhold stadig mere komplekse teknikker. For at modellere relationer tilbyder SQL Server 2017 grafdatabasefunktioner. Grafens toppunkter og kanter er repræsenteret som nye typer tabeller: NODE og EDGE. Grafforespørgsler bruger en ny T-SQL-funktion kaldet MATCH(). Da denne funktionalitet er indbygget i SQL Server 2017, kan den bruges i dine eksisterende databaser uden behov for nogen konvertering.

Fordele ved grafmodellen

I dag efterspørger virksomheder og brugere applikationer, der håndterer flere og flere data, mens de forventer høj ydeevne og pålidelighed. Repræsentation af data som en graf er et praktisk middel til at håndtere komplekse relationer. Denne tilgang løser mange problemer og hjælper med at opnå resultater inden for en given kontekst.

Det ser ud til, at mange applikationer vil drage fordel af at bruge grafdatabaser i fremtiden.

Datamodellering: fra relationel til grafmodel

Introduktion til grafdatabaser SQL Server 2017
Eksempel

Lad os se på et eksempel på en organisationsstruktur med et hierarki af medarbejdere: en medarbejder rapporterer til en leder, en leder rapporterer til en seniorleder og så videre. Afhængigt af den specifikke virksomhed kan der være et vilkårligt antal niveauer i dette hierarki. Men efterhånden som antallet af niveauer stiger, bliver det mere og mere vanskeligt at beregne relationer i en relationel database. Det er ret svært at forestille sig hierarkiet af medarbejdere, hierarki i markedsføring eller forbindelser i sociale netværk. Lad os se, hvordan SQL Graph kan løse problemet med at håndtere forskellige niveauer af hierarki.

Til dette eksempel vil vi lave en simpel datamodel. Lad os lave en tabel over medarbejdere EMP med ID EMPNO og kolonne MGR, med angivelse af identifikatoren for medarbejderens supervisor (leder). Al information om hierarkiet er gemt i denne tabel og kan forespørges ved hjælp af kolonner EMPNO и MGR.

Introduktion til grafdatabaser SQL Server 2017
Følgende diagram viser den samme organisationsstrukturmodel med fire niveauer af indlejring i en mere velkendt form. Medarbejdere er hjørnerne af en graf fra en tabel EMP. Enheden "medarbejder" er forbundet med sig selv ved forbindelsen "submits" (ReportsTo). I grafiske termer er et link en kant (EDGE), der forbinder noder (NODE) ​​af medarbejdere.

Introduktion til grafdatabaser SQL Server 2017

Lad os lave en almindelig tabel EMP og tilføj værdierne der i overensstemmelse med ovenstående diagram.

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)

Billedet herunder viser medarbejderne:

  • medarbejder med EMPNO 7369 adlyder 7902;
  • medarbejder med EMPNO 7902 adlyder 7566
  • medarbejder med EMPNO 7566 adlyder 7839

Introduktion til grafdatabaser SQL Server 2017
Lad os nu se på en grafrepræsentation af de samme data. Medarbejderens toppunkt har flere attributter og er forbundet med sig selv af forholdet "underordnede" (EmplReportsTo). EmplReportsTo er navnet på forholdet.

Kanttabellen (EDGE) kan også indeholde attributter.

Introduktion til grafdatabaser SQL Server 2017
Lad os oprette en node tabel EmpNode

Syntaksen for at skabe en node er ret enkel: til udtrykket Opret tabel tilføjes til sidst "SOM 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;

Lad os nu konvertere dataene fra en almindelig tabel til en graftabel. Næste INSERT indsætter data fra en relationstabel EMP.

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

Introduktion til grafdatabaser SQL Server 2017
I tabellen over noder i en speciel kolonne $node_id_* node-id'et gemmes som JSON. De resterende kolonner i denne tabel indeholder nodens attributter.

Oprettelse af kanter (EDGE)

Oprettelse af en kanttabel minder meget om at oprette en nodetabel, bortset fra at nøgleordet bruges "SOM KANT".

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Introduktion til grafdatabaser SQL Server 2017

Lad os nu definere forbindelser mellem medarbejdere ved hjælp af kolonner EMPNO и MGR. Organisationsstrukturdiagrammet viser tydeligt, hvordan man skriver 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);

Standardkanttabellen består af tre kolonner. Først, $edge_id — kantidentifikator i JSON-form. De to andre ($from_id и $to_id) repræsenterer forbindelsen mellem noder. Derudover kan kanter have yderligere egenskaber. I vores tilfælde er det Afd.nr.

Systemvisninger

I systemvisning sys.tables to nye kolonner er dukket op:

  1. er_kant
  2. er_node

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

Introduktion til grafdatabaser SQL Server 2017

ssms

Objekter relateret til grafer er placeret i mappen Graph Tables. Nodebordsikonet er markeret med en prik, og kantbordsikonet er markeret med to forbundne cirkler (lidt ligesom briller).

Introduktion til grafdatabaser SQL Server 2017

MATCH udtryk

ekspression MATCH taget fra CQL (Cypher Query Language). Dette er en effektiv måde at forespørge på egenskaber for en graf. CQL starter med et udtryk MATCH.

syntaks

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

Примеры

Lad os se på et par eksempler.

Forespørgslen nedenfor viser de medarbejdere, som Smith og hans leder rapporterer 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'

Introduktion til grafdatabaser SQL Server 2017
Følgende forespørgsel er til at finde medarbejdere og ledere på andet niveau for Smith. Hvis du fjerner sætningen HVOR, så vil resultatet vise alle medarbejdere.

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'

Introduktion til grafdatabaser SQL Server 2017
Og endelig en anmodning til medarbejdere og ledere på tredje niveau.

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'

Introduktion til grafdatabaser SQL Server 2017
Lad os nu skifte retning for at få Smiths chefer.

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)

Introduktion til grafdatabaser SQL Server 2017

Konklusion

SQL Server 2017 har etableret sig som en komplet virksomhedsløsning til forskellige IT-forretningsopgaver. Den første version af SQL Graph er meget lovende. Selv på trods af nogle begrænsninger, er der allerede tilstrækkelig funktionalitet til at udforske grafernes muligheder.

SQL Graph-funktionalitet er fuldt integreret i SQL Engine. Som allerede nævnt har SQL Server 2017 imidlertid følgende begrænsninger:

Ingen polymorfi-støtte.

  • Kun ensrettede forbindelser understøttes.
  • Edges kan ikke opdatere kolonnerne $from_id og $to_id via UPDATE.
  • Transitive lukninger understøttes ikke, men de kan fås ved hjælp af CTE.
  • Understøttelse af OLTP-objekter i hukommelsen er begrænset.
  • Temporale tabeller (System-Versioned Temporal Table), midlertidige lokale og globale tabeller understøttes ikke.
  • Tabeltyper og tabelvariabler kan ikke erklæres som NODE eller EDGE.
  • Forespørgsler på tværs af databaser understøttes ikke.
  • Der er ingen direkte måde eller guide til at konvertere almindelige tabeller til graftabeller.
  • Der er ingen GUI til at vise grafer, men du kan bruge Power BI.

Introduktion til grafdatabaser SQL Server 2017

Læs mere:

Kilde: www.habr.com

Tilføj en kommentar