Inleiding tot SQL Server 2017 Graph-databases

Voor aanvang van de cursus "MS SQL Server-ontwikkelaar" We hebben nog een nuttige vertaling voor u voorbereid.

Grafiekdatabases zijn een belangrijke technologie voor databaseprofessionals. Ik probeer de innovaties en nieuwe technologieën op dit gebied bij te houden en na het werken met relationele en NoSQL-databases zie ik de rol van grafendatabases steeds belangrijker worden. Bij het werken met complexe hiërarchische gegevens zijn niet alleen traditionele databases ineffectief, maar ook NoSQL. Naarmate het aantal verbindingsniveaus en de omvang van de database toenemen, nemen de prestaties vaak af. En naarmate de relaties complexer worden, neemt ook het aantal JOINs toe.

Natuurlijk heeft het relationele model oplossingen voor het werken met hiërarchieën (bijvoorbeeld door gebruik te maken van recursieve CTE's), maar dit zijn nog steeds tijdelijke oplossingen. Tegelijkertijd kunt u dankzij de functionaliteit van SQL Server-grafiekdatabases eenvoudig met meerdere hiërarchieniveaus omgaan. Zowel het datamodel als de queries zijn vereenvoudigd, waardoor de efficiëntie toeneemt. De hoeveelheid code wordt aanzienlijk verminderd.

Grafiekdatabases zijn een expressieve taal voor het weergeven van complexe systemen. Deze technologie wordt al op grote schaal gebruikt in de IT-industrie op gebieden als sociale netwerken, fraudebestrijdingssystemen, IT-netwerkanalyse, sociale aanbevelingen, product- en inhoudaanbevelingen.

De grafiekdatabasefunctionaliteit in SQL Server is geschikt voor scenario's waarin gegevens sterk met elkaar verbonden zijn en goed gedefinieerde relaties hebben.

Grafiekgegevensmodel

Een grafiek is een verzameling hoekpunten (knooppunten) en randen (relaties, rand). Hoekpunten vertegenwoordigen entiteiten, en randen vertegenwoordigen relaties waarvan de attributen informatie kunnen bevatten.

Een grafendatabase modelleert entiteiten als een grafiek zoals gedefinieerd in de grafentheorie. Datastructuren zijn hoekpunten en randen. Attributen zijn eigenschappen van hoekpunten en randen. Een verbinding is een verbinding van hoekpunten.

In tegenstelling tot andere datamodellen geven grafiekdatabases prioriteit aan relaties tussen entiteiten. Daarom is het niet nodig om relaties te berekenen met behulp van externe sleutels of andere middelen. Het is mogelijk om complexe datamodellen te maken met alleen hoekpunt- en randabstracties.

In de moderne wereld vereist het modelleren van relaties steeds complexere technieken. Om relaties te modelleren biedt SQL Server 2017 mogelijkheden voor grafische databases. De hoekpunten en randen van de grafiek worden weergegeven als nieuwe typen tabellen: NODE en EDGE. Grafiekquery's gebruiken een nieuwe T-SQL-functie genaamd MATCH(). Omdat deze functionaliteit is ingebouwd in SQL Server 2017, kan deze zonder conversie in uw bestaande databases worden gebruikt.

Voordelen van het grafiekmodel

Tegenwoordig eisen bedrijven en gebruikers applicaties die steeds meer gegevens verwerken, terwijl ze hoge prestaties en betrouwbaarheid verwachten. Het weergeven van gegevens als een grafiek biedt een handige manier om met complexe relaties om te gaan. Deze aanpak lost veel problemen op en helpt resultaten te behalen binnen een bepaalde context.

Het lijkt erop dat veel toepassingen in de toekomst zullen profiteren van het gebruik van grafische databases.

Datamodellering: van relationeel naar grafisch model

Inleiding tot SQL Server 2017 Graph-databases
Voorbeeld

Laten we eens kijken naar een voorbeeld van een organisatiestructuur met een hiërarchie van werknemers: een werknemer rapporteert aan een manager, een manager rapporteert aan een senior manager, enzovoort. Afhankelijk van het specifieke bedrijf kan deze hiërarchie een willekeurig aantal niveaus hebben. Maar naarmate het aantal niveaus toeneemt, wordt het berekenen van relaties in een relationele database steeds moeilijker. Het is vrij moeilijk om je de hiërarchie van werknemers, de hiërarchie in marketing of verbindingen in sociale netwerken voor te stellen. Laten we eens kijken hoe SQL Graph het probleem van het omgaan met verschillende hiërarchieniveaus kan oplossen.

Voor dit voorbeeld maken we een eenvoudig datamodel. Laten we een tabel met werknemers maken EMP met identiteitsbewijs EMPNO en kolom M.G.R., met vermelding van de identificatie van de leidinggevende (manager) van de medewerker. Alle informatie over de hiërarchie wordt in deze tabel opgeslagen en kan met behulp van kolommen worden opgevraagd EMPNO и M.G.R..

Inleiding tot SQL Server 2017 Graph-databases
Het volgende diagram toont hetzelfde organisatiestructuurmodel met vier nestniveaus in een meer vertrouwde vorm. Werknemers zijn de hoekpunten van een grafiek uit een tabel EMP. De entiteit “werknemer” is met zichzelf verbonden door de verbinding “submits” (ReportsTo). In grafiektermen is een link een rand (EDGE) die knooppunten (NODE) ​​van medewerkers met elkaar verbindt.

Inleiding tot SQL Server 2017 Graph-databases

Laten we een gewone tabel maken EMP en tel daar de waarden op volgens het bovenstaande 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)

Op onderstaande foto zijn de medewerkers te zien:

  • medewerker mee EMPNO 7369 gehoorzaamt 7902;
  • medewerker mee EMPNO 7902 gehoorzaamt 7566
  • medewerker mee EMPNO 7566 gehoorzaamt 7839

Inleiding tot SQL Server 2017 Graph-databases
Laten we nu eens kijken naar een grafiekweergave van dezelfde gegevens. Het EMPLOYEE-hoekpunt heeft verschillende attributen en is met zichzelf verbonden door de relatie “ondergeschikten” (EmplReportsTo). EmplReportsTo is de naam van de relatie.

De randtabel (EDGE) kan ook attributen bevatten.

Inleiding tot SQL Server 2017 Graph-databases
Laten we een knooppunttabel EmpNode maken

De syntaxis voor het maken van een knooppunt is vrij eenvoudig: naar de expressie MAAK EEN TABEL wordt aan het einde toegevoegd "ALS 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;

Laten we nu de gegevens van een gewone tabel naar een grafiek converteren. Volgende INSERT voegt gegevens uit een relationele tabel in EMP.

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

Inleiding tot SQL Server 2017 Graph-databases
In de tabel met knooppunten in een speciale kolom $node_id_* de knooppunt-ID wordt opgeslagen als JSON. De overige kolommen van deze tabel bevatten de attributen van het knooppunt.

Randen maken (EDGE)

Het maken van een edge-tabel lijkt sterk op het maken van een knooppunttabel, behalve dat het trefwoord wordt gebruikt "ALS RAND".

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Inleiding tot SQL Server 2017 Graph-databases

Laten we nu verbindingen tussen werknemers definiëren met behulp van kolommen EMPNO и M.G.R.. Het organisatiestructuurdiagram laat duidelijk zien hoe u moet schrijven 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);

De standaardrandtabel bestaat uit drie kolommen. Eerst, $edge_id — edge-ID in JSON-vorm. De andere TWEE ($from_id и $to_id) vertegenwoordigen de verbinding tussen knooppunten. Bovendien kunnen randen aanvullende eigenschappen hebben. In ons geval wel Afd.nr.

Systeemweergaven

In systeemweergave sys.tables er zijn twee nieuwe kolommen verschenen:

  1. is_edge
  2. is_knooppunt

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

Inleiding tot SQL Server 2017 Graph-databases

sms

Objecten die verband houden met grafieken bevinden zich in de map Grafiektabellen. Het knooppunttabelpictogram is gemarkeerd met een punt en het randtabelpictogram is gemarkeerd met twee verbonden cirkels (een beetje zoals een bril).

Inleiding tot SQL Server 2017 Graph-databases

MATCH-expressie

uitdrukking MATCH overgenomen uit CQL (Cypher Query Language). Dit is een efficiënte manier om eigenschappen van een grafiek op te vragen. CQL begint met een expressie MATCH.

syntaxis

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

Примеры

Laten we een paar voorbeelden bekijken.

De onderstaande zoekopdracht geeft de medewerkers weer aan wie Smith en zijn manager rapporteren.

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'

Inleiding tot SQL Server 2017 Graph-databases
De volgende zoekopdracht is bedoeld voor het vinden van medewerkers en managers op het tweede niveau voor Smith. Als je de zin verwijdert WAAR, dan worden in het resultaat alle werknemers weergegeven.

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'

Inleiding tot SQL Server 2017 Graph-databases
En tot slot een verzoek voor medewerkers en managers van het derde 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'

Inleiding tot SQL Server 2017 Graph-databases
Laten we nu van richting veranderen om de bazen van Smith te pakken te krijgen.

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)

Inleiding tot SQL Server 2017 Graph-databases

Conclusie

SQL Server 2017 heeft zichzelf bewezen als een complete bedrijfsoplossing voor verschillende IT-bedrijfstaken. De eerste versie van SQL Graph is veelbelovend. Ondanks enkele beperkingen is er al voldoende functionaliteit om de mogelijkheden van grafieken te verkennen.

De SQL Graph-functionaliteit is volledig geïntegreerd in SQL Engine. Zoals reeds vermeld heeft SQL Server 2017 echter de volgende beperkingen:

Geen ondersteuning voor polymorfisme.

  • Alleen unidirectionele verbindingen worden ondersteund.
  • Edges kunnen de kolommen $from_id en $to_id niet bijwerken via UPDATE.
  • Transitieve sluitingen worden niet ondersteund, maar kunnen worden verkregen met behulp van CTE.
  • Ondersteuning voor In-Memory OLTP-objecten is beperkt.
  • Tijdelijke tabellen (systeemversie van tijdelijke tabellen), tijdelijke lokale en globale tabellen worden niet ondersteund.
  • Tabeltypen en tabelvariabelen kunnen niet worden gedeclareerd als NODE of EDGE.
  • Query's tussen databases worden niet ondersteund.
  • Er is geen directe manier of wizard om gewone tabellen naar grafiektabellen te converteren.
  • Er is geen GUI om grafieken weer te geven, maar u kunt wel Power BI gebruiken.

Inleiding tot SQL Server 2017 Graph-databases

Lees verder:

Bron: www.habr.com

Voeg een reactie