seria până în prezent:

  1. SQL Server Grafic baze de date – Partea 1: Introducere
  2. SQL Server Grafic baze de date – Partea 2: interogarea datelor într – o bază de date Grafic
  3. SQL Server Grafic baze de date-Partea 3: Modificarea datelor într-o bază de date Grafic
  4. SQL Server Grafic baze de date – Partea 4: Lucrul cu date ierarhice într-o bază de date Grafic
  5. SQL Server: Importarea datelor relaționale într-o bază de date Graph

odată cu lansarea SQL Server 2017, Microsoft a adăugat suport pentru bazele de date graph pentru a gestiona mai bine seturile de date care conțin relații complexe de entități, cum ar fi tipul de date generate de un site de socializare, unde puteți avea un amestec de relații multi-la-multe care se schimbă frecvent. Bazele de date grafice utilizează aceleași structuri de tabel găsite în bazele de date SQL Server tradiționale și acceptă aceleași instrumente și instrucțiuni T-SQL, dar includ și caracteristici pentru stocarea și navigarea relațiilor complexe.

acest articol este primul dintr-o serie despre SQL Server graph baze de date. Articolul vă prezintă conceptele grafice de bază și demonstrează cum să creați și să populați tabele grafice, utilizând SQL Server Management Studio (SSMS) și o instanță locală a SQL Server 2017. În articolele de urmat, vom analiza modul de interogare a unei baze de date grafice și de modificare a datelor acesteia, dar pentru acest articol, începem cu elementele de bază.

baza de date SQL Server Graph

bazele de date SQL Server graph pot ajuta la simplificarea procesului de modelare a datelor care conține relații complexe multi-La-mulți și ierarhice. La cele mai de bază, o bază de date grafic este o colecție de noduri și margini care lucrează împreună pentru a defini diferite tipuri de relații. Un nod este o entitate, cum ar fi o persoană sau o locație. O margine este o relație între două entități. De exemplu, ar putea exista o relație între o locație precum Toledo și o persoană pe nume Chris, care locuiește în Toledo. Chris și Toledo sunt entitățile, iar ‘lives in’ este relația dintre cei doi.

un tabel nod în SQL Server este o colecție de entități similare, și un tabel edge este o colecție de relații similare. Pentru a înțelege cum funcționează acest lucru, luați în considerare modelul grafic prezentat în figura următoare, care se bazează pe un forum fictiv pentru iubitorii de pești. Modelul include trei noduri (FishSpecies, FishLover și FishPost) și trei margini (Like-uri, postări și LinksTo).

dreptunghiurile reprezintă nodurile, iar săgețile care leagă nodurile reprezintă marginile, cu săgețile îndreptate în direcția relației. De exemplu, marginile like-urilor pot defini oricare dintre următoarele relații:

  • un iubitor de pește îi place o specie de pește.
  • unui iubitor de pește îi place o postare despre pește.
  • unui iubitor de pește îi place un alt iubitor de pește.

puteți reprezenta toate cele trei relații ca date într-un singur tabel margine în baza de date grafic, cu fiecare relație în rândul său propriu. Un tabel de noduri funcționează la fel, cu excepția faptului că include un rând pentru fiecare entitate. De asemenea, puteți asocia proprietăți atât cu noduri, cât și cu margini. O proprietate este un atribut cheie-valoare care este definit ca o coloană într-un tabel nod sau margine. De exemplu, nodul FishSpecies ar putea include proprietăți pentru stocarea denumirilor comune și științifice ale fiecărei specii. Proprietățile sunt create ca coloane definite de utilizator în tabelul FishSpecies. Când creați un tabel de noduri, trebuie să includeți cel puțin o proprietate.

pentru majoritatea operațiilor, tabelele node și edge funcționează la fel ca orice alt tabel definit de utilizator SQL Server. Deși există câteva limitări—cum ar fi imposibilitatea de a declara tabele temporare sau variabile de tabel ca tabele de noduri sau margini—de cele mai multe ori veți constata că lucrul cu tabele grafice va fi un teritoriu familiar.

în cazul în care lucrurile devin un pic neclar este cu baza de date grafic în sine. Deși numele ar putea sugera că creați un nou tip de obiect de bază de date, nu este cazul. O bază de date grafic este doar o construcție logică definită într-o bază de date definită de utilizator, care poate suporta nu mai mult de o bază de date Grafic. Existența bazei de date grafice este relativ transparentă din exterior și, în cea mai mare parte, nu este ceva de care trebuie să vă preocupați. Când lucrați cu baze de date grafice, accentul dvs. principal va fi pe tabelele grafice și datele pe care le conțin.

în general, o bază de date grafică nu oferă capabilități pe care nu le puteți obține utilizând caracteristici relaționale tradiționale. Promisiunea bazei de date graph constă în posibilitatea de a organiza și interoga anumite tipuri de date mai eficient. Microsoft vă recomandă să luați în considerare implementarea unei baze de date grafice în următoarele situații:

  • trebuie să analizați date foarte interconectate și relațiile dintre aceste date.
  • susțineți date cu relații complexe de la mulți La mulți care evoluează continuu.
  • lucrați cu date ierarhice, în timp ce încercați să navigați în limitările tipului de date ierarhic.

caracteristicile bazei de date grafice SQL Server sunt complet integrate în motorul bazei de date, folosind componente precum procesorul de interogare și motorul de stocare. Datorită acestei integrări, puteți utiliza baze de date grafice împreună cu o gamă largă de componente, inclusiv indici columnstore, servicii de învățare automată, SSMS și diverse alte caracteristici și instrumente.

definirea tabelelor nodurilor grafice

pentru a crea o bază de date Grafic bazată pe modelul prezentat în figura precedentă, trebuie să creați trei tabele de noduri și trei tabele de margine. Microsoft a actualizat instrucțiunea Creare tabel în SQL Server 2017 pentru a include opțiuni pentru definirea oricărui tip de tabel. După cum sa menționat deja, puteți crea tabelele în orice baze de date definite de utilizator. Pentru exemplele din acest articol, am creat o bază de date numită FishGraph, așa cum se arată în următorul cod T-SQL:

1
2
3
4
5
6

utilizați master;
GO
DROP DATABASE dacă există FishGraph;
GO
crearea bazei de date FishGraph;
GO

după cum puteți vedea, nu se întâmplă nimic special aici. Creați baza de date la fel ca orice altă bază de date definită de utilizator. Nu este nimic special ce trebuie să faceți pentru a configura pentru a sprijini o bază de date Grafic.

Dacă intenționați să încercați aceste exemple pentru dvs., puteți utiliza baza de date FishGraph sau una la alegere. Orice ați decide, următorul pas este să creați tabelul node FishSpecies, utilizând următoarea instrucțiune CREATE TABLE:

1
2
3
4
5
6
7
8
9

utilizați FishGraph;
GO
DROP TABLE dacă există FishSpecies;
GO
creați TABLE FishSpecies (
FishID int identity cheie primară,
CommonName NVARCHAR(100) NOT NULL,
scientificname nvarchar(100) NOT NULL
) ca nod;

definițiile coloanelor ar trebui să fie destul de simple. Ceea ce este important aici este clauza as NODE, pe care trebuie să o includeți pentru a crea un tabel de noduri. Când specificați această clauză, motorul bazei de date adaugă două coloane în tabel (la care vom ajunge în scurt timp) și creează un index unic, care nu este pus în cluster pe una dintre aceste coloane.

puteți verifica dacă tabelul a fost creat ca tabel NOD prin interogarea sistemului.tabele vedere. Odată cu lansarea SQL Server 2017, Microsoft a actualizat vizualizarea pentru a include coloanele de biți is_node și is_edge. Dacă tabelul este un tabel nod, valoarea coloanei is_node este setată la 1, iar valoarea coloanei is_edge este setată la 0. În cazul în care un tabel de margine, valorile sunt inversate. Următorul exemplu utilizează vizualizarea pentru a confirma că tabelul FishSpecies a fost definit corect:

1
2

selectați is_node, is_edge din sys.tabele
unde name = ‘FishSpecies’;

instrucțiunea SELECT returnează rezultatele prezentate în figura următoare, care indică faptul că FishSpecies a fost creat ca un tabel nod.

Microsoft a actualizat, de asemenea, sistemul.vizualizarea coloanelor pentru a include coloanele graph_type și graph_type_desc. Puteți utiliza vizualizarea și coloanele noi pentru a afla mai multe despre tabelul FishSpecies:

1
2
3

selectați Nume, graph_type, graph_type_desc
din sys.coloane
unde object_id = OBJECT_ID (‘specii de pești’);

următoarea figură prezintă coloanele create pentru tabelul FishSpecies.

când creați un tabel nod, motorul bazei de date adaugă graph_id_< hex_string>și $node_id_< hex_string > coloane și creează un index unic, non-grupate pe coloana $node_id. Motorul bazei de date utilizează prima coloană pentru operațiuni interne și face a doua coloană disponibilă pentru acces extern. Coloana $node_id stochează un identificator unic pentru fiecare entitate, pe care îl puteți vizualiza atunci când interogați datele. Aceasta este singura coloană a celor două de care trebuie să vă preocupați. De fapt, dacă ar fi să interogați tabelul direct, veți vedea doar coloana $node_id, nu coloana graph_id.

coloanele graph_type și graph_type_desc returnate de sys.vizualizarea coloanelor este specifică coloanelor generate automat într-un tabel grafic. Coloanele indică tipurile de coloane generate de motorul bazei de date. Tipul este indicat printr-o valoare numerică predefinită și descrierea aferentă. Microsoft nu oferă o mulțime de detalii despre aceste coduri și descrieri, dar puteți găsi câteva detalii în arhitectura Microsoft document SQL Graph. Din nou, preocuparea dvs. principală este cu coloana $node_id și datele pe care le conține.

după ce ați creat tabelul, puteți începe să adăugați date. Rularea unei instrucțiuni INSERT împotriva unui tabel nod funcționează la fel ca orice alt tabel. Specificați coloanele țintă și valorile acestora, așa cum se arată în exemplul următor:

1
2
3
4
5
6
7
8
9
10
11

INSERT INTO FishSpecies (CommonName, ScientificName) VALUES
(‘Atlantic halibut’, ‘Hippoglossus hippoglossus’),
(‘Chinook salmon’, ‘Oncorhynchus tshawytscha’),
(‘European seabass’, ‘Morone (Decentrarchus) labrax’),
(‘Gizzard shad’, ‘Dorosoma cepedianum’),
(‘Japanese striped knife jaw’, ‘Oplegnathus faciatus’),
(‘stiuca de Nord’, ‘Esox lucius’),
(‘heringul Pacificului’, ‘Clupea pallasi’),
(‘păstrăv curcubeu’, ‘Oncorhynchus mykiss’),
(‘talpă (Dover)’, ‘Solea solea’),
(‘bass Alb’, ‘Morone chrysops’);

desigur, puteți adăuga orice specie de pește pentru care aveți o anumită afecțiune. Alegerile mele aici au fost complet arbitrare. Dar dacă rămâneți cu datele mele și apoi interogați tabelul FishSpecies, rezultatele dvs. ar trebui să arate similar cu cele din figura următoare.

după cum sa menționat mai sus, coloana graph_id nu apare în rezultate, dar coloana $node_id o face, completată cu valori generate automat. Motorul bazei de date creează fiecare valoare ca un șir JSON care furnizează tipul (nod sau margine), schema, tabelul și o valoare BIGINT unică pentru fiecare rând. Așa cum era de așteptat, motorul bazei de date returnează, de asemenea, valorile din coloanele definite de utilizator, la fel ca un tabel relațional tipic.

următorul pas este să creați și să populați tabelul nodului FishLover, utilizând următorul cod T-SQL:

1
2
3
4
5
6
7
8
9
10
11
12

DROP tabel dacă există FishLover;
du-te
Creare tabel FishLover (
FishLoverID cheie primară identitate int,
Nume utilizator NVARCHAR (50) nu NULL,
) ca nod;
introduceți în FishLover (nume de utilizator) valori
(‘powerangler’),
(‘jessie98’),
(‘hooked’),
(‘deepdive’),
(‘underwatercasey’);

tabelul include doar două coloane definite de utilizator-FishLoverID și UserName—dar puteți defini cât mai multe coloane după cum este necesar. De exemplu, poate doriți să includeți numele și prenumele, informațiile de contact și alte detalii, în funcție de natura aplicației. După ce ați creat tabelul, puteți rula apoi o interogare pentru a verifica datele. Rezultatele dvs. ar trebui să arate similar cu cele prezentate în figura următoare.

apoi, puteți lua aceiași pași pentru a crea și popula tabelul FishPost, trecând în orice text de mesaj doriți:

1
2
3
4
5
6
7
8
9
10
11
12
13

DROP TABLE dacă există FishPost;
du-te
crea FishPost tabel (
PostID cheie primară identitate INT,
Titlu NVARCHAR(50) nu NULL,
MessageText NVARCHAR(800) nu NULL
) ca nod;
introduceți în fishpost (titlu, MESSAGETEXT) valorile
(‘cel care a scăpat’, ‘echipa noastră este disponibilă, vă rugăm să ne contactați. Aeneas avantaj are nevoie rezervate.’),
(‘un studiu asupra peștilor’, ‘penatibus venenatis, nascetur ridiculus mus.’),
(‘Hook, linie și sinker’, ‘ Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.’),
(‘atât de mulți pești, atât de puțin timp’, ‘nullam dictum felis eu pede mollis pretium. Întreg tincidunt.’),
(‘peștele meu preferat’, ‘ Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.’);

următoarea figură arată rezultatele pe care le-ați vedea dacă ați rămas cu datele Lorem Ipsum.

asta e tot ce există pentru crearea și popularea tabelelor de noduri. Cu excepția clauzei nod AS din Instrucțiunea Creare tabel, majoritatea celorlalte lucruri sunt afaceri ca de obicei.

definirea tabelelor de margine a graficului

crearea unui tabel de margine este similară cu crearea unui tabel de noduri, cu excepția faptului că trebuie să specificați clauza as EDGE mai degrabă decât clauza as NODE. De exemplu, pentru a crea tabelul postări, utilizați următoarea instrucțiune Creare tabel:

1
2
3
4
5

DROP TABLE dacă există postări;
du-te
creați posturi de masă (
ImportantFlag bit nu implicit null 0
) ca margine;

definiția tabelului este similară cu un tabel de noduri, cu excepția faptului că nu include o coloană cheie primară (și, desigur, este nevoie de clauza as EDGE). În acest caz, o cheie primară nu este necesară, dar dacă la un moment dat stabiliți că aveți nevoie de o cheie primară, cu siguranță puteți adăuga una. (Veți vedea în scurt timp de ce cheile primare sunt utile pentru tabelele de noduri.)

observați că definiția tabelului include și coloana ImportantFlag. Am inclus acest lucru în primul rând pentru a demonstra că puteți adăuga coloane definite de utilizator la tabelul edge, la fel ca în cazul tabelelor node. Acestea fiind spuse, nu este neobișnuit să creați un tabel edge fără coloane definite de utilizator, spre deosebire de un tabel de noduri, care trebuie să includă cel puțin o coloană definită de utilizator.

după crearea tabelului edge, puteți verifica dacă a fost definit corect prin interogarea sistemului.vizualizarea tabelelor, așa cum ați văzut mai devreme:

1
2

selectați is_node, is_edge din sys.tabele
unde Name = ‘postări’;

dacă ați făcut totul bine, rezultatele dvs. ar trebui să arate ca cele din figura următoare.

de asemenea, puteți interoga sistemul.vizualizarea tabelelor pentru a verifica detaliile coloanelor, la fel cum ați făcut înainte:

1
2
3

selectați Nume, graph_type, graph_type_desc
din sys.coloane
unde object_id = OBJECT_ID (‘posturi’);

următoarea figură arată rezultatele returnate pe sistemul meu.

după cum puteți vedea, motorul bazei de date adaugă opt coloane la un tabel de margine, mai degrabă decât cele două pe care le-ați văzut cu tabele de noduri. Din nou, consultați documentul SQL Graph Architecture pentru descrieri ale fiecărui tip de coloană. Majoritatea acestor coloane sunt utilizate de motorul bazei de date pentru operațiuni interne. Trebuie să vă preocupați în primul rând de următoarele trei coloane:

  • coloana $edge_id_ < hex_string > identifică în mod unic fiecare relație.
  • coloana $from_id_<hex_string > stochează valoarea $node_id asociată entității în tabelul de unde provine relația.
  • coloana $to_id_<hex_string > stochează valoarea $node_id asociată entității în tabelul în care relația se termină.

ca și în coloana $node_id dintr-un tabel de noduri, motorul bazei de date generează automat valori pentru coloana $edge_id. Cu toate acestea, trebuie să adăugați în mod specific valori la coloanele $from_id și $to_id pentru a defini o relație. Pentru a demonstra cum funcționează, vom începe cu o singură înregistrare:

1
2
3

introduceți în posturi ($from_id, $to_id) valori (
(selectați $node_id din FishLover unde FishLoverID = 1),
(selectați $node_id din FishPost unde PostID = 3));

instrucțiunea INSERT definește o relație în tabelul Posts între o entitate FishLover a cărei valoare FishLoverID este 1 și o entitate FishPost a cărei valoare PostID este 3. Observați că puteți utiliza pseudonimele $node_id, $from_id și $to_id pentru a face referire la coloanele țintă, fără a fi nevoie să veniți cu șirurile hexagonale.

pentru a adăuga date în coloana $from_id, trebuie să specificați valoarea $node_id asociată entității FishLover. O modalitate de a obține această valoare este de a include o subinterogare care vizează entitatea, folosind valoarea cheie primară. Puteți lua aceeași abordare pentru coloana $from_id.

Inserarea datelor în acest mod demonstrează de ce este util să adăugați chei primare la tabelele de noduri, dar nu este necesar pentru tabelele de margine. Tastele primare de pe tabelele nodului facilitează furnizarea valorii $node_id instrucțiunii INSERT.

dacă interogați acum tabelul postări, rezultatele dvs. ar trebui să arate similar cu cele prezentate în figura următoare.

tabelul trebuie să conțină noua relație, cu ImportantFlag setat la 0, implicit. Acum Puteți adăuga încă câteva rânduri, utilizând următoarele instrucțiuni Inserare:

1
2
3
4
5
6
7
8
9
10
11
12

introduceți în posturi ($from_id, $to_id) valori (
(selectați $node_id din FishLover unde FishLoverID = 3),
(selectați $node_id din FishPost unde PostID = 2));
introduceți în posturi ($from_id, $to_id) valori (
(selectați $node_id din FishLover unde FishLoverID = 2),
(selectați $node_id din FishPost unde PostID = 5));
introduceți în posturi ($from_id, $to_id, ImportantFlag) valori (
(selectați $node_id din FishLover unde FishLoverID = 5),
(selectați $node_id din FishPost unde PostID = 4), 1);
introduceți în posturi ($from_id, $to_id, ImportantFlag) valori (
(selectați $node_id din FishLover unde FishLoverID = 4),
(selectați $node_id din FishPost unde PostID = 1), 1);

observați că ultimele două declarații Inserare oferă, de asemenea, o valoare pentru coloana ImportantFlag. Când interogați tabelul postări, rezultatele dvs. ar trebui să includă acum toate cele cinci rânduri.

următorul pas este să creați și să populați tabelul de Aprecieri, utilizând următorul cod T-SQL:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE dacă există Like-uri;
GO
creați like-uri de tabel ca EDGE;
introduceți în like-uri ($from_id, $to_id) valori (
(selectați $node_id din FishLover unde FishLoverID = 3),
(selectați $node_id din FishSpecies unde FishID = 8));
introduceți în Likes ($from_id, $to_id) valori (
(selectați $node_id din FishLover unde FishLoverID = 5),
(selectați $node_id din FishPost unde PostID = 4));
introduceți în Likes ($from_id, $to_id) valori (
(selectați $node_id din FishLover unde FishLoverID = 1),
(selectați $node_id din FishLover unde FishLoverID = 4));

puteți, desigur, să definiți orice relații doriți. Punctul important de observat aici este că nu vă limitați la niciun set de noduri. De exemplu, prima instrucțiune INSERT creează o relație între FishLover și FishSpecies, a doua declarație creează o relație între FishLover și FishPost, iar a treia declarație creează o relație între FishLover și FishLover. Acest lucru ne oferă rezultatele interogării prezentate în figura următoare.

puteți adopta aceeași abordare atunci când creați și populați tabelul LinksTo:

1
2
3
4
5
6
7
8
9
10
11
12

DROP tabel dacă există LinksTo;
du-te
creați LINKSTO tabel ca margine;
introduceți în LinksTo ($from_id, $to_id) valori (
(selectați $node_id din FishPost unde PostID = 2),
(selectați $node_id din FishSpecies unde FishID = 6));
introduceți în LinksTo ($from_id, $to_id) valori (
(selectați $node_id din FishPost unde PostID = 4),
(selectați $node_id din FishLover unde FishLoverID = 1));
introduceți în LinksTo ($from_id, $to_id) valori (
(selectați $node_id din FishPost unde PostID = 3),
(selectați $node_id din FishPost unde PostID = 5));

următoarea figură arată cum ar trebui să arate datele după ce au fost adăugate la tabel, presupunând că ați urmat exemplul.

cu o bază de date grafic, puteți adăuga o gamă largă de relații între nodurile de origine și de terminare. De asemenea, puteți încorpora cu ușurință modificări ale modelului grafic. De exemplu, puteți decide să adăugați un tabel de noduri FishRecipes pentru stocarea rețetelor de pește pe care utilizatorii le postează pe forum, caz în care puteți utiliza postările, aprecierile și linkurile existentela tabelele edge.

Mergând mai departe cu bazele de date grafice

deoarece Microsoft include caracteristicile bazei de date grafice ca parte a motorului bazei de date SQL Server, le puteți încerca cu ușurință fără a fi necesar să instalați sau să reconfigurați orice componente. Cel mai bine, puteți utiliza aceleași instrumente și proceduri pe care le-ați folosit tot timpul pentru a crea și popula tabele de noduri și margini. În articolele de urmat, vom acoperi modul de interogare și modificare a datelor grafice și vom arunca o privire mai atentă asupra lucrului cu date ierarhice, așa că asigurați-vă că rămâneți la curent.

Lasă un răspuns

Adresa ta de email nu va fi publicată.