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.
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.
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
- Untuk mulai menggunakan SQL Graph, lihat SQL Graph Database - Sampel