Pengenalan kepada Pangkalan Data Graf SQL Server 2017

Sebelum kursus bermula "Pembangun Pelayan MS SQL" Kami telah menyediakan satu lagi terjemahan yang berguna untuk anda.

Pangkalan data graf ialah teknologi penting untuk profesional pangkalan data. Saya cuba untuk bersaing dengan inovasi dan teknologi baharu dalam bidang ini dan, selepas bekerja dengan pangkalan data hubungan dan NoSQL, saya melihat peranan pangkalan data graf menjadi semakin penting. Apabila bekerja dengan data hierarki yang kompleks, bukan sahaja pangkalan data tradisional tidak berkesan, tetapi juga NoSQL. Selalunya, apabila bilangan tahap sambungan dan saiz pangkalan data meningkat, prestasi berkurangan. Dan apabila perhubungan menjadi lebih kompleks, bilangan JOIN juga meningkat.

Sudah tentu, model hubungan mempunyai penyelesaian untuk bekerja dengan hierarki (contohnya, menggunakan CTE rekursif), tetapi ini masih penyelesaian. Pada masa yang sama, kefungsian pangkalan data graf SQL Server membolehkan anda mengendalikan pelbagai peringkat hierarki dengan mudah. Kedua-dua model data dan pertanyaan dipermudahkan, dan oleh itu kecekapannya meningkat. Jumlah kod dikurangkan dengan ketara.

Pangkalan data graf ialah bahasa ekspresif untuk mewakili sistem yang kompleks. Teknologi ini sudah digunakan secara meluas dalam industri IT dalam bidang seperti rangkaian sosial, sistem anti-penipuan, analisis rangkaian IT, cadangan sosial, cadangan produk dan kandungan.

Kefungsian pangkalan data graf dalam SQL Server sesuai untuk senario di mana data sangat saling berkaitan dan mempunyai hubungan yang jelas.

Model data graf

Graf ialah satu set bucu (nod) dan tepi (hubungan, tepi). Bucu mewakili entiti, dan tepi mewakili perhubungan yang atributnya mungkin mengandungi maklumat.

Pangkalan data graf memodelkan entiti sebagai graf seperti yang ditakrifkan dalam teori graf. Struktur data ialah bucu dan tepi. Atribut ialah sifat bucu dan tepi. Sambungan ialah sambungan bucu.

Tidak seperti model data lain, pangkalan data graf mengutamakan hubungan antara entiti. Oleh itu, tidak perlu mengira perhubungan menggunakan kunci asing atau sebarang cara lain. Adalah mungkin untuk mencipta model data yang kompleks hanya menggunakan abstraksi bucu dan tepi.

Dalam dunia moden, perhubungan model memerlukan teknik yang semakin kompleks. Untuk memodelkan perhubungan, SQL Server 2017 menawarkan keupayaan pangkalan data graf. Bucu dan tepi graf diwakili sebagai jenis jadual baharu: NOD dan TEPI. Pertanyaan graf menggunakan fungsi T-SQL baharu yang dipanggil MATCH(). Memandangkan fungsi ini terbina dalam SQL Server 2017, ia boleh digunakan dalam pangkalan data sedia ada anda tanpa memerlukan sebarang penukaran.

Faedah model graf

Hari ini, perniagaan dan pengguna menuntut aplikasi yang mengendalikan lebih banyak data, sambil mengharapkan prestasi tinggi dan kebolehpercayaan. Mewakilkan data sebagai graf menawarkan cara yang mudah untuk mengendalikan perhubungan yang kompleks. Pendekatan ini menyelesaikan banyak masalah dan membantu mendapatkan hasil dalam konteks tertentu.

Nampaknya banyak aplikasi akan mendapat manfaat daripada menggunakan pangkalan data graf pada masa hadapan.

Pemodelan data: daripada model hubungan kepada graf

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Contoh

Mari kita lihat contoh struktur organisasi dengan hierarki pekerja: pekerja melaporkan kepada pengurus, pengurus melaporkan kepada pengurus kanan dan sebagainya. Bergantung pada syarikat tertentu, mungkin terdapat beberapa peringkat dalam hierarki ini. Tetapi apabila bilangan tahap meningkat, mengira hubungan dalam pangkalan data hubungan menjadi lebih dan lebih sukar. Agak sukar untuk membayangkan hierarki pekerja, hierarki dalam pemasaran atau sambungan dalam rangkaian sosial. Mari lihat bagaimana Grafik SQL boleh menyelesaikan masalah mengendalikan tahap hierarki yang berbeza.

Untuk contoh ini kami akan membuat model data mudah. Mari buat jadual pekerja EMP dengan ID EMPNO dan lajur M.G.R., menunjukkan pengecam penyelia pekerja (pengurus). Semua maklumat tentang hierarki disimpan dalam jadual ini dan boleh disoal menggunakan lajur EMPNO ΠΈ M.G.R..

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Rajah berikut menunjukkan model struktur organisasi yang sama dengan empat peringkat sarang dalam bentuk yang lebih biasa. Pekerja ialah bucu graf daripada jadual EMP. Entiti "pekerja" disambungkan kepada dirinya sendiri dengan sambungan "serahkan" (ReportsTo). Dari segi graf, pautan ialah tepi (EDGE) yang menghubungkan nod (NODE) ​​pekerja.

Pengenalan kepada Pangkalan Data Graf SQL Server 2017

Mari buat jadual biasa EMP dan tambahkan nilai di sana mengikut rajah di atas.

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)

Gambar di bawah menunjukkan pekerja:

  • pekerja dengan EMPNO 7369 mematuhi 7902;
  • pekerja dengan EMPNO 7902 mematuhi 7566
  • pekerja dengan EMPNO 7566 mematuhi 7839

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Sekarang mari kita lihat perwakilan graf bagi data yang sama. Puncak PEKERJA mempunyai beberapa atribut dan disambungkan kepada dirinya sendiri oleh hubungan "orang bawahan" (EmplReportsTo). EmplReportsTo ialah nama perhubungan.

Jadual tepi (EDGE) juga mungkin mengandungi atribut.

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Mari buat jadual nod EmpNode

Sintaks untuk mencipta nod agak mudah: kepada ungkapan BUAT JADUAL ditambah hingga akhir "SEBAGAI NOD".

CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;

Sekarang mari kita tukar data daripada jadual biasa kepada satu graf. Seterusnya INSERT memasukkan data daripada jadual hubungan EMP.

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

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Dalam jadual nod dalam lajur khas $node_id_* ID nod disimpan sebagai JSON. Lajur baki jadual ini mengandungi atribut nod.

Mencipta tepi (EDGE)

Mencipta jadual tepi sangat serupa dengan membuat jadual nod, kecuali kata kunci digunakan "SEBAGAI TEPI".

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Pengenalan kepada Pangkalan Data Graf SQL Server 2017

Sekarang mari kita tentukan hubungan antara pekerja menggunakan lajur EMPNO ΠΈ M.G.R.. Gambar rajah struktur organisasi jelas menunjukkan cara menulis 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);

Jadual tepi lalai terdiri daripada tiga lajur. pertama, $edge_id β€” pengecam tepi dalam bentuk JSON. Dua lagi ($from_id ΠΈ $to_id) mewakili sambungan antara nod. Di samping itu, tepi boleh mempunyai sifat tambahan. Dalam kes kami ia adalah Deptno.

Pandangan Sistem

Dalam paparan sistem sys.tables dua lajur baharu telah muncul:

  1. is_edge
  2. is_node

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

Pengenalan kepada Pangkalan Data Graf SQL Server 2017

ssms

Objek yang berkaitan dengan graf terletak dalam folder Jadual Graf. Ikon jadual nod ditandakan dengan titik, dan ikon jadual tepi ditandakan dengan dua bulatan bersambung (sedikit seperti cermin mata).

Pengenalan kepada Pangkalan Data Graf SQL Server 2017

Ekspresi PERLAWANAN

Ungkapan MATCH diambil daripada CQL (Cypher Query Language). Ini ialah cara yang cekap untuk menanyakan sifat graf. CQL bermula dengan ungkapan MATCH.

sintaks

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

contoh

Mari lihat beberapa contoh.

Pertanyaan di bawah memaparkan pekerja yang Smith dan pengurusnya laporkan.

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'

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Pertanyaan berikut adalah untuk mencari pekerja dan pengurus peringkat kedua untuk Smith. Jika anda mengeluarkan ayat itu DIMANA, maka hasilnya akan memaparkan semua pekerja.

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'

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Dan akhirnya, permintaan untuk pekerja dan pengurus peringkat ketiga.

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'

Pengenalan kepada Pangkalan Data Graf SQL Server 2017
Sekarang mari kita beralih arah untuk mendapatkan bos 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)

Pengenalan kepada Pangkalan Data Graf SQL Server 2017

Kesimpulan

SQL Server 2017 telah mewujudkan dirinya sebagai penyelesaian perusahaan yang lengkap untuk pelbagai tugas perniagaan IT. Versi pertama Grafik SQL sangat menjanjikan. Walaupun terdapat beberapa batasan, sudah ada kefungsian yang mencukupi untuk menerokai keupayaan graf.

Fungsi Grafik SQL disepadukan sepenuhnya ke dalam Enjin SQL. Walau bagaimanapun, seperti yang telah dinyatakan, SQL Server 2017 mempunyai had berikut:

Tiada sokongan polimorfisme.

  • Hanya sambungan satu arah disokong.
  • Edges tidak boleh mengemas kini lajur $from_id dan $to_id melalui UPDATE.
  • Penutupan transitif tidak disokong, tetapi ia boleh diperoleh menggunakan CTE.
  • Sokongan untuk objek OLTP Dalam Memori adalah terhad.
  • Jadual sementara (Jadual Temporal Versi Sistem), jadual tempatan dan global sementara tidak disokong.
  • Jenis jadual dan pembolehubah jadual tidak boleh diisytiharkan sebagai NODE atau EDGE.
  • Pertanyaan merentas pangkalan data tidak disokong.
  • Tiada cara langsung atau wizard untuk menukar jadual biasa kepada jadual graf.
  • Tiada GUI untuk memaparkan graf, tetapi anda boleh menggunakan Power BI.

Pengenalan kepada Pangkalan Data Graf SQL Server 2017

Baca lebih lanjut:

Sumber: www.habr.com

Tambah komen