Sdílet prostřednictvím


Architektura SQL Graphu

platí pro: SQL Server 2017 (14.x) a novější verze Azure SQL DatabaseAzure SQL Managed Instancesql database v Microsoft Fabric

Přečtěte si o architektuře SQL Graphu. Znalost základů usnadňuje pochopení dalších článků o SQL Graphu.

Databáze SQL Graphu

Uživatelé můžou vytvořit jeden graf na databázi. Graf je kolekce uzlu a hraničních tabulek. Uzly nebo hraniční tabulky je možné vytvořit v libovolném schématu v databázi, ale všechny patří do jednoho logického grafu. Tabulka uzlů je kolekce podobného typu uzlů. Tabulka uzlů Person například obsahuje všechny Person uzly, které patří do grafu. Podobně je hraniční tabulka kolekcí podobného typu hran. Například Friends hraniční tabulka obsahuje všechny hrany, které propojují Person s jinou Person. Vzhledem k tomu, že uzly a hrany jsou uložené v tabulkách, většina operací podporovaných u běžných tabulek se podporuje na hraničních nebo hraničních tabulkách.

Následující diagram znázorňuje architekturu databáze SQL Graphu.

diagram znázorňující architekturu databáze SQL Graphu

Tabulka uzlů

Tabulka uzlů představuje entitu ve schématu grafu. Při každém vytvoření tabulky uzlu spolu s uživatelem definovanými sloupci se vytvoří implicitní $node_id sloupec, který jednoznačně identifikuje daný uzel v databázi. Hodnoty v $node_id se automaticky vygenerují a jsou kombinací ID objektu pro tabulku grafu tabulky uzlu a interně vygenerovanou bigint hodnotu. Pokud je ale vybraný sloupec $node_id, zobrazí se vypočítaná hodnota ve formě řetězce JSON. $node_id je také pseudosloupce, která se mapuje na interní název s jedinečnou příponou. Když v tabulce vyberete $node_id pseudosloupce, zobrazí se název sloupce jako $node_id_<unique suffix>.

Poznámka

Použití pseudosloupců v dotazech je jediným podporovaným a doporučeným způsobem dotazování interního $node_id sloupce. V dotazech byste neměli přímo používat sloupce $node_id_<hex_string>. Vypočítaná reprezentace JSON zobrazená v pseudosloupců je navíc podrobností implementace. Neměli byste mít přímou závislost na formátu této reprezentace JSON. Pokud se s tímto vyjádřením JSON musíte vypořádat, zvažte použití NODE_ID_FROM_PARTS() a dalších souvisejících systémových funkcí . Nedoporučuje se přímo používat pseudosloupce grafu ($node_id, $from_id, $to_id) v predikátech. Například predikát jako n.$node_id = e.$from_id by se měl vyhnout. Taková porovnání bývají neefektivní, protože převod na reprezentaci JSON je neefektivní. Místo toho se spolehněte na funkci POZVYHLEDAT co nejvíce.

Doporučuje se, aby uživatelé vytvořili jedinečné omezení nebo index ve sloupci $node_id při vytváření tabulky uzlů, ale pokud se nevytvoří, vytvoří se automaticky výchozí jedinečný neclusterovaný index. Jakýkoli index pseudosloupce grafu se však vytvoří na podkladových interních sloupcích. To znamená, že index vytvořený ve sloupci $node_id se zobrazí v interním sloupci graph_id_<hex_string>.

Tabulka Edge

Hraniční tabulka představuje relaci v grafu. Hrany jsou vždy směrovány a propojují dva uzly. Hraniční tabulka umožňuje uživatelům modelovat relace M:N v grafu. Sloupce definované uživatelem ("atributy") jsou volitelné v hraniční tabulce. Při každém vytvoření hraniční tabulky spolu s uživatelem definovanými sloupci se v hraniční tabulce vytvoří tři implicitní sloupce:

Název sloupce Popis
$edge_id Jednoznačně identifikuje danou hranu v databázi. Jedná se o vygenerovaný sloupec a hodnota je kombinací object_id hraniční tabulky a interně vygenerované bigint hodnoty. Pokud je ale vybraný sloupec $edge_id, zobrazí se vypočítaná hodnota ve formě řetězce JSON. $edge_id je pseudosloupce, která se mapuje na interní název s jedinečnou příponou. Když v tabulce vyberete $edge_id, název sloupce se zobrazí jako $edge_id_<unique suffix>. Použití pseudosloupcových názvů v dotazech je doporučený způsob dotazování interního sloupce $edge_id a použití interního názvu s šestnáctkovým řetězcem by se mělo vyhnout.
$from_id Ukládá $node_id uzlu, odkud pochází hrana.
$to_id Uloží $node_id uzlu, na kterém se hrana ukončí.

Uzly, ke kterým se daný okraj může připojit, řídí data vložená do $from_id a $to_id sloupců. V první verzi není možné definovat omezení hraniční tabulky, aby se zabránilo připojení jakéhokoli typu uzlů. To znamená, že hrana může propojit libovolné dva uzly v grafu bez ohledu na jejich typy.

Podobně jako u sloupce $node_id se doporučuje, aby uživatelé vytvořili jedinečný index nebo omezení pro sloupec $edge_id při vytváření hraniční tabulky, ale pokud se nevytvoří, vytvoří se u tohoto sloupce automaticky neclusterovaný index. Jakýkoli index pseudosloupce grafu se však vytvoří na podkladových interních sloupcích. To znamená, že index vytvořený ve sloupci $edge_id se zobrazí v interním sloupci graph_id_<unique suffix>. Doporučuje se také, aby uživatelé ve scénářích OLTP vytvořili index ve sloupcích ($from_id, $to_id) pro rychlejší vyhledávání ve směru okraje.

Následující diagram znázorňuje, jak jsou v databázi uložené uzly a hraniční tabulky.

Diagram znázorňující reprezentaci tabulky Node a Edge

Metadata

Pomocí těchto zobrazení metadat můžete zobrazit atributy uzlu nebo hraniční tabulky.

sys.tables

Následující bit sloupce v sys.tables lze použít k identifikaci tabulek grafu. Pokud je is_node nastavená na hodnotu 1, tabulka je tabulka uzlu a pokud je is_edge nastavená na hodnotu 1, jedná se o hraniční tabulku.

Název sloupce Datový typ Popis
is_node bit U tabulek uzlů je is_node nastavená na hodnotu 1.
is_edge bit U hraničních tabulek je is_edge nastavená na hodnotu 1.

sys.columns

Sloupce graph_type a graph_type_desc v zobrazení sys.columns jsou užitečné při pochopení různých typů sloupců používaných v uzlu grafu a hraničních tabulkách:

Název sloupce Datový typ Popis
graph_type Int Interní sloupec se sadou hodnot Hodnoty jsou v rozmezí 1 až 8 pro sloupce grafu a NULL pro ostatní.
graph_type_desc nvarchar(60) Interní sloupec se sadou hodnot

V následující tabulce jsou uvedeny platné hodnoty pro sloupec graph_type:

Hodnota sloupce Popis
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 také ukládá informace o implicitních sloupcích vytvořených v uzlu nebo hraničních tabulkách. Následující informace lze načíst ze sloupců sys.columns, ale uživatelé nemohou vybrat tyto sloupce z uzlu nebo hraniční tabulky.

Implicitní sloupce v tabulce uzlů jsou:

Název sloupce Datový typ is_hidden Komentář
graph_id_\<hex_string> BIGINT 1 Hodnota ID interního grafu
$node_id_\<hex_string> NVARCHAR 0 Externí reprezentace znaku ID uzlu

Implicitní sloupce v hraniční tabulce jsou:

Název sloupce Datový typ is_hidden Komentář
graph_id_\<hex_string> BIGINT 1 Hodnota ID interního grafu
$edge_id_\<hex_string> NVARCHAR 0 Reprezentace znaku HRANIČNÍho ID
from_obj_id_\<hex_string> INT 1 Interní object_id hodnota "z uzlu".
from_id_\<hex_string> BIGINT 1 Hodnota ID interního grafu pro "z uzlu".
$from_id_\<hex_string> NVARCHAR 0 reprezentace znaku "z uzlu".
to_obj_id_\<hex_string> INT 1 Interní object_id pro uzel "to node".
to_id_\<hex_string> BIGINT 1 Hodnota ID interního grafu pro uzel to node
$to_id_\<hex_string> NVARCHAR 0 Externí reprezentace znaku "do uzlu".

Systémové funkce

K interakci s pseudosloupci v tabulkách grafů můžete použít následující předdefinované funkce. Podrobné odkazy jsou k dispozici pro každou z těchto funkcí v příslušných odkazech na funkce T-SQL.

Vestavěný Popis
OBJECT_ID_FROM_NODE_ID Extrahujte ID objektu tabulky grafu z node_id.
GRAPH_ID_FROM_NODE_ID Extrahujte hodnotu ID grafu z node_id.
NODE_ID_FROM_PARTS Vytvořte node_id z ID objektu pro tabulku grafu a hodnotu ID grafu.
OBJECT_ID_FROM_EDGE_ID Extrahujte ID objektu tabulky grafu z edge_id.
GRAPH_ID_FROM_EDGE_ID Extrahujte hodnotu ID grafu pro danou edge_id.
EDGE_ID_FROM_PARTS Vytvořte edge_id z ID objektu pro hodnotu ID grafu a grafu.

referenční informace k Transact-SQL

Seznamte se s rozšířeními Transact-SQL zavedených v SQL Serveru a Azure SQL Database, která umožňují vytvářet a dotazovat objekty grafů. Rozšíření dotazovacího jazyka pomáhají dotazovat a procházet graf pomocí syntaxe umění ASCII.

Příkazy DDL (Data Definition Language)

Úkol Související článek Poznámky
CREATE TABLE CREATE TABLE (Transact-SQL) CREATE TABLE se teď rozšiřuje o podporu vytváření tabulky JAKO NODE nebo AS EDGE. Hraniční tabulka nemusí mít žádné uživatelem definované atributy.
ALTER TABLE ALTER TABLE (Transact-SQL) Uzly a hraniční tabulky lze změnit stejným způsobem jako relační tabulka pomocí ALTER TABLE. Uživatelé můžou přidávat nebo upravovat uživatelem definované sloupce, indexy nebo omezení. Změna interních sloupců grafu, jako jsou $node_id nebo $edge_id, ale způsobí chybu.
CREATE INDEX CREATE INDEX (Transact-SQL) Uživatelé můžou vytvářet indexy u pseudosloupců a uživatelsky definovaných sloupců v uzlu a hraničních tabulkách. Podporují se všechny typy indexů, včetně clusterovaných a neclusterovaných indexů columnstore.
VYTVOŘENÍ OMEZENÍ EDGE HRANIČNÍ OMEZENÍ (Transact-SQL) Uživatelé teď můžou vytvářet hraniční omezení u hraničních tabulek, která vynucuje specifickou sémantiku a také udržuje integritu dat.
DROP TABLE DROP TABLE (Transact-SQL) Uzly a hraniční tabulky lze vynechat stejným způsobem jako relační tabulka pomocí DROP TABLE. V současné době neexistují žádné mechanismy, které by zabránily odstranění uzlů, na které odkazují hrany. Při odstranění uzlu (nebo vyřazení celé tabulky uzlů) neexistuje žádná podpora kaskádového odstranění hran. Ve všech takových případech musí být všechny hrany připojené k odstraněnými uzly odstraněny ručně, aby se zachovala konzistence grafu.

Příkazy jazyka DML (Data Manipulation Language)

Úkol Související článek Poznámky
VLOŽIT INSERT (Transact-SQL) Vložení do tabulky uzlů se nijak neliší od vložení do relační tabulky. Hodnoty pro sloupec $node_id se vygenerují automaticky. Při pokusu o vložení hodnoty do $node_id nebo $edge_id sloupce dojde k chybě. Uživatelé musí zadat hodnoty pro $from_id a $to_id sloupce při vkládání do hraniční tabulky. $from_id a $to_id jsou $node_id hodnoty uzlů, které daná hrana spojuje.
VYMAZAT DELETE (Transact-SQL) Data z uzlů nebo hraničních tabulek je možné odstranit stejným způsobem, jako jsou odstraněná z relačních tabulek. V této verzi ale neexistují žádná omezení, která by zajistila, že při odstranění uzlu nejsou podporovány žádné hrany směřující na odstraněný uzel a kaskádové odstranění hran. Doporučujeme, aby se při každém odstranění uzlu odstranily také všechny spojovací hrany k uzlu.
AKTUALIZACE UPDATE (Transact-SQL) Hodnoty ve sloupcích definovaných uživatelem je možné aktualizovat pomocí příkazu UPDATE. Nemůžete aktualizovat interní sloupce grafu, $node_id, $edge_id, $from_id a $to_id.
SLOUČIT MERGE (Transact-SQL) příkaz MERGE je podporován v uzlu nebo hraniční tabulce.

Příkazy dotazu

Úkol Související článek Poznámky
VYBRAT SELECT (Transact-SQL) Vzhledem k tomu, že uzly a hrany jsou uložené jako tabulky, podporuje se většina operací tabulek také na hraničních a hraničních tabulkách.
UTKÁNÍ MATCH (Transact-SQL) Funkce POZVYHLEDAT integrovaná pro podporu porovnávání vzorů a procházení prostřednictvím grafu.

Omezení

U uzlů a hraničních tabulek platí určitá omezení:

  • Místní nebo globální dočasné tabulky nesmí být uzly ani hraniční tabulky.
  • Typy tabulek a proměnné tabulky nelze deklarovat jako uzel nebo hraniční tabulku.
  • Uzly a hraniční tabulky nelze vytvořit jako dočasné tabulky s systémovou verzí.
  • Tabulky uzlů a hraničních tabulek nemůžou být optimalizované pro paměť.
  • Uživatelé nemůžou aktualizovat $from_id a $to_id sloupce okraje pomocí příkazu UPDATE. Pokud chcete aktualizovat uzly, na které odkazuje hraniční zařízení, musí uživatelé vložit nový okraj odkazující na nové uzly a odstranit předchozí.
  • Dotazy napříč databázemi na objekty grafů se nepodporují.
  • Pseudosloupce grafu (node_id, $from_id, $to_id a edge_id) nelze použít jako sloupce řazení pro uspořádaný clusterovaný index columnstore. Při pokusu o použití libovolných pseudosloupců grafu jako sloupců řazení pro seřazené clusterované columnstore dojde k Msg 102: Incorrect syntax chybě.
  • V Databáze SQL Fabric, SQL Graph je povolen, ale tabulky Node a Edge se nebudou zrcadlit na Fabric OneLake.

Viz také

  • Graph Functions (Transact-SQL)

Další kroky