Architektura SQL Graphu
platí pro: SQL Server 2017 (14.x) a novější verze
Azure SQL Database
Azure SQL Managed Instance
sql 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
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.
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)
Příkazy dotazu
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
aedge_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 kMsg 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é
Další kroky
- Pokud chcete začít pracovat s SQL Graphem, přečtěte si téma SQL Graph Database – ukázková