Bagikan melalui


Arsitektur SQL Graph

Berlaku untuk: SQL Server 2017 (14.x) dan azure SQL DatabaseAzure SQL Managed Instance yang lebih baru

Pelajari tentang arsitektur SQL Graph. Mengetahui dasar-dasarnya membuatnya lebih mudah untuk memahami artikel SQL Graph lainnya.

Database SQL Graph

Pengguna dapat membuat satu grafik per database. Grafik adalah kumpulan tabel simpul dan tepi. Tabel simpul atau tepi dapat dibuat di bawah skema apa pun dalam database, tetapi semuanya termasuk dalam satu grafik logis. Tabel simpul adalah kumpulan jenis node serupa. Misalnya, Person tabel simpul menyimpan semua simpul Person milik grafik. Demikian pula, tabel tepi adalah kumpulan jenis tepi yang sama. Misalnya, Friends tabel edge menampung semua tepi yang menyambungkan ke tepi Person lainnya Person. Karena simpul dan tepi disimpan dalam tabel, sebagian besar operasi yang didukung pada tabel reguler didukung pada tabel simpul atau tepi.

Diagram berikut menunjukkan arsitektur database SQL Graph.

Diagram showing the SQL Graph database architecture.

Tabel simpul

Tabel simpul mewakili entitas dalam skema grafik. Setiap kali tabel simpul dibuat, bersama dengan kolom yang ditentukan pengguna, kolom implisit $node_id dibuat, yang secara unik mengidentifikasi simpul tertentu dalam database. Nilai dalam $node_id dibuat secara otomatis dan merupakan kombinasi ID objek untuk tabel grafik tabel simpul tersebut dan nilai bigint yang dihasilkan secara internal. Namun, ketika $node_id kolom dipilih, nilai komputasi dalam bentuk string JSON ditampilkan. Selain itu, $node_id adalah kolom pseudo yang memetakan ke nama internal dengan akhiran unik. Saat Anda memilih $node_id kolom pseudo dari tabel, nama kolom muncul sebagai $node_id_<unique suffix>.

Catatan

Menggunakan kolom pseudo dalam kueri adalah satu-satunya cara yang didukung dan direkomendasikan untuk mengkueri kolom internal $node_id . Anda tidak boleh langsung menggunakan $node_id_<hex_string> kolom dalam kueri apa pun. Selanjutnya, representasi JSON komputasi yang ditunjukkan dalam kolom pseudo, adalah detail implementasi. Anda tidak boleh mengambil dependensi langsung pada format representasi JSON tersebut. Jika Anda harus menangani representasi JSON ini, pertimbangkan untuk menggunakan NODE_ID_FROM_PARTS() dan Fungsi Sistem terkait lainnya. Tidak disarankan untuk langsung menggunakan kolom pseudo grafik ($node_id, , $from_id$to_id) dalam predikat. Misalnya, predikat seperti n.$node_id = e.$from_id harus dihindari. Perbandingan tersebut cenderung tidak efisien, karena konversi ke representasi JSON. Sebagai gantinya, mengandalkan fungsi MATCH sejauh mungkin.

Disarankan agar pengguna membuat batasan atau indeks unik pada kolom pada $node_id saat pembuatan tabel simpul, tetapi jika tidak dibuat, indeks non-kluster unik default dibuat secara otomatis. Namun, indeks apa pun pada kolom pseudo grafik dibuat pada kolom internal yang mendasar. Artinya, indeks yang dibuat pada $node_id kolom, muncul di kolom internal graph_id_<hex_string> .

Tabel Edge

Tabel tepi mewakili hubungan dalam grafik. Tepi selalu diarahkan dan menyambungkan dua simpul. Tabel edge memungkinkan pengguna untuk memodelkan hubungan banyak ke banyak dalam grafik. Kolom yang ditentukan pengguna ("atribut") bersifat opsional dalam tabel edge. Setiap kali tabel edge dibuat, bersama dengan kolom yang ditentukan pengguna, tiga kolom implisit dibuat dalam tabel edge:

Nama kolom Deskripsi
$edge_id Secara unik mengidentifikasi tepi tertentu dalam database. Ini adalah kolom yang dihasilkan dan nilainya adalah kombinasi dari object_id tabel edge dan nilai bigint yang dihasilkan secara internal. Namun, ketika $edge_id kolom dipilih, nilai komputasi dalam bentuk string JSON ditampilkan. $edge_id adalah kolom pseudo yang memetakan ke nama internal dengan akhiran unik. Saat Anda memilih $edge_id dari tabel, nama kolom muncul sebagai $edge_id_<unique suffix>. Menggunakan nama kolom pseudo dalam kueri adalah cara yang direkomendasikan untuk mengkueri kolom internal $edge_id dan menggunakan nama internal dengan string hex harus dihindari.
$from_id $node_id Menyimpan node, dari mana tepi berasal.
$to_id $node_id Menyimpan simpul, di mana tepi berakhir.

Simpul yang dapat disambungkan oleh tepi tertentu dikontrol oleh data yang disisipkan dalam $from_id kolom dan $to_id . Dalam rilis pertama, tidak dimungkinkan untuk menentukan batasan pada tabel edge, untuk membatasinya menyambungkan dua jenis node apa pun. Artinya, tepi dapat menghubungkan dua simpul apa pun dalam grafik, terlepas dari jenisnya.

Mirip $node_id dengan kolom, disarankan agar pengguna membuat indeks atau batasan unik pada $edge_id kolom pada saat pembuatan tabel edge, tetapi jika tidak dibuat, indeks unik dan non-kluster default secara otomatis dibuat pada kolom ini. Namun, indeks apa pun pada kolom pseudo grafik dibuat pada kolom internal yang mendasar. Artinya, indeks yang dibuat pada $edge_id kolom, muncul di kolom internal graph_id_<unique suffix> . Disarankan juga, untuk skenario OLTP, pengguna membuat indeks pada kolom ($from_id, $to_id) untuk pencarian yang lebih cepat ke arah tepi.

Diagram berikut menunjukkan bagaimana tabel simpul dan tepi disimpan dalam database.

Diagram showing the Node and edge table representation.

Metadata

Gunakan tampilan metadata ini untuk melihat atribut tabel simpul atau tepi.

sys.tables

Kolom berikut bit dalam sys.tables dapat digunakan untuk mengidentifikasi tabel grafik. Jika is_node diatur ke 1, tabel adalah tabel simpul, dan jika is_edge diatur ke 1, tabel adalah tabel tepi.

Nama kolom Jenis Data Deskripsi
is_node bit Untuk tabel simpul, is_node diatur ke 1.
is_edge bit Untuk tabel tepi, is_edge diatur ke 1.

sys.columns

Kolom graph_type dan graph_type_desc dalam sys.columns tampilan berguna dalam memahami berbagai jenis kolom yang digunakan dalam simpul grafik dan tabel tepi:

Nama kolom Jenis Data Deskripsi
graph_type int Kolom internal dengan sekumpulan nilai. Nilainya antara 1-8 untuk kolom grafik dan NULL untuk yang lain.
graph_type_desc nvarchar(60) Kolom internal dengan sekumpulan nilai.

Tabel berikut ini mencantumkan nilai yang valid untuk graph_type kolom:

Nilai Kolom Deskripsi
1 GRAPH_ID
2 GRAPH_ID_COMPUTED
3 GRAPH_FROM_ID
4 GRAPH_FROM_OBJ_ID
5 GRAPH_FROM_ID_COMPUTED
6 GRAPH_TO_ID
7 GRAPH_TO_OBJ_ID
8 GRAPH_TO_ID_COMPUTED

sys.columns juga menyimpan informasi tentang kolom implisit yang dibuat dalam tabel simpul atau tepi. Informasi berikut dapat diambil dari sys.columns, namun, pengguna tidak dapat memilih kolom ini dari tabel simpul atau tepi.

Kolom implisit dalam tabel simpul adalah:

Nama kolom Jenis Data is_hidden Komentar
graph_id_\<hex_string> BIGINT 1 Nilai ID grafik internal.
$node_id_\<hex_string> NVARCHAR 0 Representasi karakter eksternal dari ID simpul.

Kolom implisit dalam tabel edge adalah:

Nama kolom Jenis Data is_hidden Komentar
graph_id_\<hex_string> BIGINT 1 Nilai ID grafik internal.
$edge_id_\<hex_string> NVARCHAR 0 Representasi karakter ID tepi.
from_obj_id_\<hex_string> INT 1 Nilai internal object_id untuk "dari simpul".
from_id_\<hex_string> BIGINT 1 Nilai ID grafik internal untuk "dari simpul".
$from_id_\<hex_string> NVARCHAR 0 representasi karakter "dari simpul".
to_obj_id_\<hex_string> INT 1 Internal object_id untuk "ke node".
to_id_\<hex_string> BIGINT 1 Nilai ID grafik internal untuk "ke node".
$to_id_\<hex_string> NVARCHAR 0 Eksternal, representasi karakter dari "ke node".

Fungsi sistem

Anda dapat menggunakan fungsi bawaan berikut untuk berinteraksi dengan kolom pseudo dalam tabel grafik. Referensi terperinci disediakan untuk masing-masing fungsi ini dalam referensi fungsi T-SQL masing-masing.

Bawaan Deskripsi
OBJECT_ID_FROM_NODE_ID Ekstrak ID objek untuk tabel grafik dari node_id.
GRAPH_ID_FROM_NODE_ID Ekstrak nilai ID grafik dari node_id.
NODE_ID_FROM_PARTS Buat node_id dari ID objek untuk tabel grafik dan nilai ID grafik.
OBJECT_ID_FROM_EDGE_ID Ekstrak ID objek untuk tabel grafik dari edge_id.
GRAPH_ID_FROM_EDGE_ID Ekstrak nilai ID grafik untuk .edge_id
EDGE_ID_FROM_PARTS Buat edge_id dari ID objek untuk tabel grafik dan nilai ID grafik.

Referensi T-SQL

Pelajari ekstensi Transact-SQL yang diperkenalkan di SQL Server dan Azure SQL Database yang memungkinkan pembuatan dan kueri objek grafik. Ekstensi bahasa kueri membantu mengkueri dan melintasi grafik menggunakan sintaks seni ASCII.

Pernyataan Bahasa Definisi Data (DDL)

Tugas Artikel Terkait Catatan
CREATE TABLE BUAT TABEL (Transact-SQL) CREATE TABLE sekarang diperluas untuk mendukung pembuatan tabel AS NODE atau AS EDGE. Tabel edge mungkin atau mungkin tidak memiliki atribut yang ditentukan pengguna.
ALTER TABLE ALTER TABLE (Transact-SQL) Tabel simpul dan tepi dapat diubah dengan cara yang sama seperti tabel relasional, menggunakan ALTER TABLE. Pengguna dapat menambahkan atau mengubah kolom, indeks, atau batasan yang ditentukan pengguna. Namun, mengubah kolom grafik internal, seperti $node_id atau $edge_id, menghasilkan kesalahan.
CREATE INDEX BUAT INDEKS (Transact-SQL) Pengguna dapat membuat indeks pada kolom pseudo dan kolom yang ditentukan pengguna dalam tabel simpul dan tepi. Semua jenis indeks didukung, termasuk indeks penyimpan kolom berkluster dan non-kluster.
MEMBUAT BATASAN EDGE BATASAN EDGE (T-SQL) Pengguna sekarang dapat membuat batasan tepi pada tabel edge untuk memberlakukan semantik tertentu dan juga mempertahankan integritas data
DROP TABLE DROP TABLE (Transact-SQL) Tabel simpul dan tepi dapat dihilangkan dengan cara yang sama seperti tabel relasional, menggunakan DROP TABLE. Saat ini, tidak ada mekanisme untuk mencegah penghapusan simpul, yang dirujuk oleh tepi. Tidak ada dukungan untuk penghapusan tepi berkade, setelah penghapusan node (atau menjatuhkan seluruh tabel simpul). Dalam semua kasus seperti itu, tepi apa pun yang terhubung ke simpul yang dihapus harus dihapus secara manual, untuk mempertahankan konsistensi grafik.

Pernyataan Bahasa Manipulasi Data (DML)

Tugas Artikel Terkait Catatan
INSERT INSERT (Transact-SQL) Menyisipkan ke dalam tabel simpul tidak berbeda dengan menyisipkan ke dalam tabel relasional. Nilai untuk $node_id kolom dibuat secara otomatis. Mencoba menyisipkan nilai dalam $node_id atau $edge_id kolom menghasilkan kesalahan. Pengguna harus menyediakan nilai untuk $from_id kolom dan $to_id saat menyisipkan ke dalam tabel edge. $from_id dan $to_id merupakan $node_id nilai simpul yang disambungkan oleh tepi tertentu.
DELETE DELETE (Transact-SQL) Data dari tabel simpul atau tepi dapat dihapus dengan cara yang sama seperti dihapus dari tabel relasional. Namun, dalam rilis ini, tidak ada batasan untuk memastikan bahwa tidak ada tepi yang menunjuk ke node yang dihapus dan penghapusan tepi yang berkapasitas, setelah penghapusan node tidak didukung. Disarankan agar setiap kali simpul dihapus, semua tepi penghubung ke simpul tersebut juga dihapus.
UPDATE UPDATE (Transact-SQL) Nilai dalam kolom yang ditentukan pengguna dapat diperbarui menggunakan pernyataan UPDATE. Anda tidak dapat memperbarui kolom grafik internal, , $node_id, $edge_id$from_id dan $to_id.
GABUNG MERGE (Transact-SQL) MERGE pernyataan didukung pada tabel simpul atau tepi.

Pernyataan Kueri

Tugas Artikel Terkait Catatan
SELECT SELECT (Transact-SQL) Karena simpul dan tepi disimpan sebagai tabel, sebagian besar operasi tabel juga didukung pada tabel simpul dan tepi.
COCOK MATCH (Transact-SQL) MATCH bawaan diperkenalkan untuk mendukung pencocokan pola dan traversal melalui grafik.

Batasan

Ada batasan tertentu pada tabel simpul dan tepi:

  • Tabel sementara lokal atau global tidak boleh berupa tabel simpul atau tepi.
  • Jenis tabel dan variabel tabel tidak dapat dinyatakan sebagai simpul atau tabel tepi.
  • Tabel simpul dan tepi tidak dapat dibuat sebagai tabel temporal versi sistem.
  • Tabel simpul dan tepi tidak dapat menjadi tabel memori yang dioptimalkan.
  • Pengguna tidak dapat memperbarui $from_id kolom dan $to_id tepi menggunakan pernyataan UPDATE. Untuk memperbarui simpul yang dirujuk oleh tepi, pengguna harus menyisipkan tepi baru yang menunjuk ke simpul baru, dan menghapus yang sebelumnya.
  • Kueri lintas database pada objek grafik tidak didukung.

Baca juga

Langkah berikutnya