Pengenalan ke Database Grafik SQL Server 2017

Menjelang dimulainya kursus "Pengembang MS SQL Server" kami telah menyiapkan terjemahan lain yang berguna untuk Anda.








Database grafik adalah teknologi penting bagi para profesional database. Saya mencoba mengikuti inovasi dan teknologi baru di bidang ini dan setelah bekerja dengan database relasional dan NoSQL, saya melihat bahwa peran database grafik berkembang. Saat bekerja dengan data hierarki yang kompleks, tidak hanya database tradisional, tetapi juga NoSQL tidak efektif. Seringkali, dengan peningkatan jumlah tingkat tautan dan ukuran basis, kinerja menurun. Dan saat hubungan menjadi lebih kompleks, jumlah JOIN juga meningkat.



Tentu saja, ada solusi dalam model relasional untuk bekerja dengan hierarki (misalnya, menggunakan CTE rekursif), tetapi ini masih merupakan solusi. Pada saat yang sama, fungsionalitas database grafik SQL Server memungkinkan Anda untuk dengan mudah memproses beberapa tingkat hierarki. Baik model data dan kueri disederhanakan dan karena itu lebih efisien. Jumlah kode berkurang secara signifikan.



Database grafik adalah bahasa ekspresif untuk mewakili sistem yang kompleks. Teknologi ini sudah banyak digunakan dalam industri TI di berbagai bidang seperti media sosial, sistem anti penipuan, analisis jaringan TI, rekomendasi sosial, rekomendasi produk dan konten.



Fungsionalitas database grafik di SQL Server cocok untuk skenario di mana data digabungkan erat dan memiliki hubungan yang terdefinisi dengan baik.



Model data grafik



Grafik adalah sekumpulan simpul (node) dan tepi (hubungan). Simpul mewakili entitas, dan tepi mewakili tautan yang atributnya dapat berisi informasi.



Database graph memodelkan entitas dalam bentuk grafik, seperti yang didefinisikan dalam teori grafik. Struktur data adalah simpul dan tepi. Atribut adalah properti simpul dan tepi. Tautan adalah koneksi simpul.



Tidak seperti model data lainnya, dalam database grafik, hubungan antar entitas lebih diutamakan. Oleh karena itu, tidak perlu menghitung hubungan menggunakan kunci asing atau cara lain. Anda dapat membuat model data kompleks hanya dengan menggunakan abstraksi verteks dan tepi.



Di dunia modern, hubungan pemodelan membutuhkan teknik yang semakin canggih. Untuk hubungan pemodelan, SQL Server 2017 menawarkan kapabilitas database grafik. Simpul dan tepi grafik direpresentasikan sebagai jenis tabel baru: NODE dan EDGE. Fungsi T-SQL baru yang disebut MATCH () digunakan untuk membuat kueri grafik. Karena fungsionalitas ini dibangun ke dalam SQL Server 2017, fungsi ini dapat digunakan di database Anda yang sudah ada tanpa perlu konversi apa pun.



Manfaat model grafik



Saat ini, bisnis dan pengguna sama-sama menuntut aplikasi yang menangani lebih banyak data, sambil mengharapkan kinerja dan keandalan yang tinggi. Penyajian data dalam bentuk grafik menawarkan alat yang nyaman untuk menangani hubungan yang kompleks. Pendekatan ini memecahkan banyak masalah dan membantu Anda mendapatkan hasil dalam konteks tertentu.



Tampaknya di masa mendatang, banyak aplikasi akan mendapat manfaat dari penggunaan database grafik.



Pemodelan Data: Dari Relasional ke Model Grafik





Contoh



Mari kita lihat contoh struktur organisasi dengan hierarki karyawan: karyawan melapor ke manajer, manajer melapor ke manajer senior, dan sebagainya. Hierarki ini dapat memiliki beberapa tingkatan, tergantung pada perusahaan tertentu. Tetapi dengan bertambahnya jumlah lapisan, menghitung hubungan dalam database relasional menjadi semakin sulit. Agak sulit untuk merepresentasikan hierarki karyawan, hierarki dalam koneksi pemasaran atau media sosial. Mari kita lihat bagaimana SQL Graph dapat memecahkan masalah penanganan berbagai level hierarki.



Untuk contoh ini, mari kita buat model data sederhana. Mari buat tabel karyawan EMP dengan pengenal EMPNO dan kolom MGR, yang menunjukkan pengenal manajer (manajer) dari karyawan tersebut. Semua informasi tentang hierarki disimpan dalam tabel ini dan dapat ditanyai menggunakan kolom EMPNO dan MGR .





Diagram berikut menunjukkan model bagan organisasi yang sama dengan empat tingkat penumpukan dalam bentuk yang lebih dikenal. Karyawan adalah simpul grafik dari tabel EMP . Entitas "karyawan" ditautkan ke dirinya sendiri melalui link "penyerahan" (ReportsTo). Dalam istilah grafik, link adalah edge (EDGE) yang menghubungkan node (NODE) ​​karyawan.







Mari buat tabel EMP biasa dan tambahkan nilainya di sana sesuai dengan diagram 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 karyawan:



  • karyawan dengan EMPNO 7369 melapor ke 7902;
  • karyawan dengan EMPNO 7902 mematuhi 7566
  • karyawan dengan EMPNO 7566 mematuhi 7839




Sekarang mari kita lihat representasi grafik dari data yang sama. Node EMPLOYEE memiliki beberapa atribut dan dikaitkan dengan dirinya sendiri oleh hubungan "obey" (ProspekPortortTo). EmployReportsTo adalah nama relasi.



Tabel tepi (EDGE) juga dapat berisi atribut.





Membuat Tabel EmpNode Node



Sintaks untuk membuat node cukup sederhana: pernyataan CREATE TABLE ditambahkan dengan "AS NODE" di akhir .



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 ubah data dari tabel biasa menjadi grafik. INSERT berikutnya menyisipkan data dari tabel relasional EMP .



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




Node $node_id_*ID disimpan di kolom khusus pada tabel node dalam bentuk JSON. Kolom yang tersisa dari tabel ini berisi atribut node.



Create Edges (EDGE)



Membuat tabel tepi sangat mirip dengan membuat tabel node, kecuali kata kunci "AS EDGE" yang digunakan .



CREATE TABLE empReportsTo(Deptno int) AS EDGE






Sekarang mari kita tentukan hubungan antara karyawan menggunakan kolom EMPNO dan MGR . Bagan organisasi 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);


Tabel tepi default memiliki tiga kolom. Yang pertama $edge_idadalah pengenal JSON edge. Dua lainnya ( $from_iddan $to_id) mewakili komunikasi antar node. Selain itu, tulang rusuk bisa memiliki khasiat tambahan. Dalam kasus kami, ini Deptno .



Tampilan sistem



Ada sys.tablesdua kolom baru dalam tampilan sistem :



  1. is_edge
  2. is_node


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






SSMS



Objek terkait grafik terletak di folder Tabel Grafik. Ikon tabel simpul ditandai dengan titik, dan ikon tabel tepi ditandai dengan dua lingkaran terkait (yang terlihat seperti kacamata).





Ekspresi MATCH



Ekspresi MATCH diambil dari CQL (Cypher Query Language). Ini adalah cara yang efisien untuk menanyakan properti grafik. CQL dimulai dengan ekspresi MATCH .



Sintaksis



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 kita lihat beberapa contoh.



Kueri di bawah ini menampilkan karyawan yang menjadi sasaran Smith dan manajernya.



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'




Kueri berikutnya adalah untuk menemukan karyawan dan manajer tingkat kedua untuk Smith. Jika Anda menghapus klausa WHERE , maka hasilnya akan menampilkan semua karyawan.



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'




Dan terakhir, permintaan untuk karyawan dan manajer tingkat 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'




Sekarang mari kita ubah 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)




Kesimpulan



SQL Server 2017 telah memantapkan dirinya sebagai solusi perusahaan lengkap untuk berbagai tantangan bisnis TI. Versi pertama SQL Graph sangat menjanjikan. Meskipun ada beberapa batasan, fungsionalitas sudah cukup untuk mengeksplorasi kemampuan grafik.



Fungsionalitas SQL Graph terintegrasi penuh ke dalam SQL Engine. Namun, seperti yang disebutkan, SQL Server 2017 memiliki batasan berikut:



Tidak ada dukungan polimorfisme.



  • .
  • $from_id $to_id UPDATE.
  • (transitive closure), CTE.
  • In-Memory OLTP.
  • (System-Versioned Temporal Table), .
  • NODE EDGE.
  • (cross-database queries).
  • - (wizard) .
  • GUI, Power BI.






:






All Articles