SQL Graph 아키텍처
적용 대상: SQL Server 2017(14.x) 이상
Azure SQL Database
Azure SQL Managed Instance
SQL Graph의 아키텍처에 대해 알아봅니다. 기본 사항을 알고 있으면 다른 SQL Graph 문서를 더 쉽게 이해할 수 있습니다.
SQL Graph 데이터베이스
사용자는 데이터베이스당 하나의 그래프를 만들 수 있습니다. 그래프는 노드 및 에지 테이블의 컬렉션입니다. 노드 또는 에지 테이블은 데이터베이스의 모든 스키마 아래에 만들 수 있지만 모두 하나의 논리 그래프에 속합니다. 노드 테이블은 유사한 유형의 노드 컬렉션입니다. 예를 들어 노드 테이블에는 Person
그래프에 Person
속하는 모든 노드가 포함됩니다. 마찬가지로 에지 테이블은 비슷한 유형의 에지 컬렉션입니다. 예를 들어 에지 테이블에는 Friends
다른 Person
에지에 연결하는 모든 가장자리가 Person
포함됩니다. 노드와 에지는 테이블에 저장되므로 일반 테이블에서 지원되는 대부분의 작업은 노드 또는 에지 테이블에서 지원됩니다.
다음 다이어그램은 SQL Graph 데이터베이스 아키텍처를 보여줍니다.
노드 테이블
노드 테이블은 그래프 스키마의 엔터티를 나타냅니다. 노드 테이블을 만들 때마다 사용자 정의 열과 함께 데이터베이스에서 지정된 노드를 고유하게 식별하는 암시적 $node_id
열이 만들어집니다. 값 $node_id
은 자동으로 생성되며 해당 노드 테이블의 그래프 테이블에 대한 개체 ID와 내부적으로 생성된 bigint 값의 조합입니다. 그러나 $node_id
열을 선택하면 JSON 문자열 형식의 계산 값이 표시됩니다. $node_id
또한 고유한 접미사가 있는 내부 이름에 매핑되는 의사 열입니다. 테이블에서 의사 열을 선택하면 $node_id
열 이름이 .로 $node_id_<unique suffix>
표시됩니다.
참고 항목
쿼리에서 의사 열을 사용하는 것은 내부 $node_id
열을 쿼리하는 유일한 지원 및 권장 방법입니다. 쿼리에서 $node_id_<hex_string>
열을 직접 사용하면 안 됩니다.
또한 의사 열에 표시된 계산된 JSON 표현은 구현 세부 정보입니다. 해당 JSON 표현의 형식에 직접 종속되지 않아야 합니다. 이 JSON 표현을 처리해야 하는 경우 NODE_ID_FROM_PARTS() 및 기타 관련 시스템 함수를 사용하는 것이 좋습니다.
조건자에서 그래프 의사 열($node_id
, $from_id
, $to_id
)을 직접 사용하지 않는 것이 좋습니다. 예를 들어 조건 n.$node_id = e.$from_id
자는 피해야 합니다. 이러한 비교는 JSON 표현으로의 변환으로 인해 비효율적인 경향이 있습니다. 대신 가능한 한 MATCH 함수를 사용합니다.
노드 테이블을 만들 때 열에 $node_id
고유한 제약 조건 또는 인덱스나 고유 제약 조건을 만드는 것이 좋지만, 노드 테이블을 만들지 않으면 기본 고유의 비클러스터형 인덱스가 자동으로 만들어집니다. 그러나 그래프 의사 열의 인덱스는 기본 내부 열에 만들어집니다. 즉, 열에 $node_id
생성된 인덱스가 내부 graph_id_<hex_string>
열에 나타납니다.
Edge 테이블
에지 테이블은 그래프의 관계를 나타냅니다. 에지는 항상 두 개의 노드를 전달하고 연결합니다. 에지 테이블을 사용하면 그래프에서 다대다 관계를 모델링할 수 있습니다. 에지 테이블에서 사용자 정의 열("특성")은 선택 사항입니다. 에지 테이블을 만들 때마다 사용자 정의 열과 함께 에지 테이블에 세 개의 암시적 열이 만들어집니다.
열 이름 | 설명 |
---|---|
$edge_id |
데이터베이스에서 지정된 에지를 고유하게 식별합니다. 생성된 열이며 값은 에지 테이블의 object_id 내부적으로 생성된 bigint 값의 조합입니다 . 그러나 $edge_id 열을 선택하면 JSON 문자열 형식의 계산 값이 표시됩니다. $edge_id 는 고유한 접미사가 있는 내부 이름에 매핑되는 의사 열입니다. 테이블에서 선택하면 $edge_id 열 이름이 .로 $edge_id_<unique suffix> 표시됩니다. 쿼리에서 의사 열 이름을 사용하는 것이 내부 $edge_id 열을 쿼리하고 16진수 문자열과 함께 내부 이름을 사용하는 것이 좋습니다. |
$from_id |
에지가 $node_id 시작되는 노드의 위치를 저장합니다. |
$to_id |
에지가 $node_id 종료되는 노드를 저장합니다. |
지정된 에지가 연결할 수 있는 노드는 열 및 $to_id
열에 $from_id
삽입된 데이터에 의해 제어됩니다. 첫 번째 릴리스에서는 에지 테이블에 제약 조건을 정의하여 두 가지 유형의 노드를 연결하지 못하도록 제한할 수 없습니다. 즉, 에지는 형식에 관계없이 그래프의 두 노드를 연결할 수 있습니다.
열과 $node_id
마찬가지로 사용자가 에지 테이블을 만들 때 열에 $edge_id
고유한 인덱스 또는 제약 조건을 만드는 것이 좋지만, 열이 만들어지지 않으면 이 열에 고유한 비클러스터형 기본 인덱스가 자동으로 만들어집니다. 그러나 그래프 의사 열의 인덱스는 기본 내부 열에 만들어집니다. 즉, 열에 $edge_id
생성된 인덱스가 내부 graph_id_<unique suffix>
열에 나타납니다. 또한 OLTP 시나리오의 경우 에지 방향으로 더 빠른 조회를 위해 ($from_id
, $to_id
) 열에 대한 인덱스를 만드는 것이 좋습니다.
다음 다이어그램에서는 노드 및 에지 테이블이 데이터베이스에 저장되는 방법을 보여 줍니다.
메타데이터
이러한 메타데이터 뷰를 사용하여 노드 또는 에지 테이블의 특성을 볼 수 있습니다.
sys.tables
sys.tables의 다음 bit
열을 사용하여 그래프 테이블을 식별할 수 있습니다. 1로 설정된 경우 is_node
테이블은 노드 테이블이고 1로 설정된 경우 is_edge
테이블은 에지 테이블입니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
is_node | bit | 노드 테이블 is_node 의 경우 1로 설정됩니다. |
is_edge | bit | 에지 테이블 is_edge 의 경우 1로 설정됩니다. |
sys.columns
보기의 sys.columns
열과 열은 graph_type
그래프 노드 및 graph_type_desc
에지 테이블에 사용되는 다양한 유형의 열을 이해하는 데 유용합니다.
열 이름 | 데이터 형식 | 설명 |
---|---|---|
graph_type | INT | 값 집합이 있는 내부 열입니다. 값은 그래프 열의 경우 1~8이고 다른 열의 경우 NULL 입니다. |
graph_type_desc | nvarchar(60) | 값 집합이 있는 내부 열입니다. |
다음 표에서는 열에 유효한 graph_type
값을 나열합니다.
열 값 | 설명 |
---|---|
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
에서는 노드 또는 에지 테이블에서 만든 암시적 열에 대한 정보도 저장합니다. 다음 정보는 sys.columns에서 검색할 수 있지만 사용자는 노드 또는 에지 테이블에서 이러한 열을 선택할 수 없습니다.
노드 테이블의 암시적 열은 다음과 같습니다.
열 이름 | 데이터 형식 | is_hidden | 의견 |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 6 | 내부 그래프 ID 값입니다. |
$node_id_\<hex_string> |
Nvarchar | 0 | 노드 ID의 외부 문자 표현입니다. |
에지 테이블의 암시적 열은 다음과 같습니다.
열 이름 | 데이터 형식 | is_hidden | 의견 |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 6 | 내부 그래프 ID 값입니다. |
$edge_id_\<hex_string> |
Nvarchar | 0 | 에지 ID의 문자 표현입니다. |
from_obj_id_\<hex_string> |
INT | 6 | "from node"의 내부 object_id 값입니다. |
from_id_\<hex_string> |
BIGINT | 6 | "from node"의 내부 그래프 ID 값입니다. |
$from_id_\<hex_string> |
Nvarchar | 0 | "from node"의 문자 표현입니다. |
to_obj_id_\<hex_string> |
INT | 6 | "to node"에 대한 내부 object_id 입니다. |
to_id_\<hex_string> |
BIGINT | 6 | "to node"의 내부 그래프 ID 값입니다. |
$to_id_\<hex_string> |
Nvarchar | 0 | "to node"의 외부 문자 표현입니다. |
시스템 함수
다음 기본 제공 함수를 사용하여 그래프 테이블의 의사 열과 상호 작용할 수 있습니다. 각 T-SQL 함수 참조에서 이러한 각 함수에 대한 자세한 참조가 제공됩니다.
기본 제공 | 설명 |
---|---|
OBJECT_ID_FROM_NODE_ID | 에서 그래프 테이블의 개체 ID를 추출합니다 node_id . |
GRAPH_ID_FROM_NODE_ID | 에서 그래프 ID 값을 추출합니다 node_id . |
NODE_ID_FROM_PARTS | 그래프 테이블의 개체 ID 및 그래프 ID 값에서 node_id 생성합니다. |
OBJECT_ID_FROM_EDGE_ID | 에서 그래프 테이블의 개체 ID를 edge_id 추출합니다. |
GRAPH_ID_FROM_EDGE_ID | 지정된 edge_id 에 대한 그래프 ID 값을 추출합니다. |
EDGE_ID_FROM_PARTS | 그래프 테이블 및 그래프 ID 값에 대한 개체 ID에서 생성 edge_id 합니다. |
Transact-SQL 참조
그래프 개체를 만들고 쿼리할 수 있도록 하는 SQL Server 및 Azure SQL Database에 도입된 Transact-SQL 확장에 대해 알아봅니다. 쿼리 언어 확장은 ASCII 아트 구문을 사용하여 그래프를 쿼리하고 트래버스하는 데 도움이 됩니다.
DDL(데이터 정의 언어) 문
작업 | 관련 문서 | 참고 |
---|---|---|
CREATE TABLE | CREATE TABLE(Transact-SQL) | CREATE TABLE 는 이제 AS NODE 또는 AS EDGE 테이블 만들기를 지원하도록 확장되었습니다. 에지 테이블에는 사용자 정의 특성이 있거나 없을 수 있습니다. |
ALTER TABLE | ALTER TABLE(Transact-SQL) | 노드 및 에지 테이블은 관계형 테이블 ALTER TABLE 과 동일한 방식으로 변경할 수 있습니다. 사용자는 사용자 정의 열, 인덱스 또는 제약 조건을 추가하거나 수정할 수 있습니다. 그러나 내부 그래프 열(예 $node_id : 또는 $edge_id )을 변경하면 오류가 발생합니다. |
CREATE INDEX | CREATE INDEX(Transact-SQL) | 사용자는 노드 및 에지 테이블의 의사 열 및 사용자 정의 열에 인덱스를 만들 수 있습니다. 클러스터형 및 비클러스터형 columnstore 인덱스를 포함하여 모든 인덱스 형식이 지원됩니다. |
CREATE EDGE 제약 조건 | EDGE 제약 조건(Transact-SQL) | 이제 사용자는 에지 테이블에 에지 제약 조건을 만들어 특정 의미 체계를 적용하고 데이터 무결성을 유지할 수 있습니다. |
DROP TABLE | DROP TABLE(Transact-SQL) | 노드 및 에지 테이블은 관계형 테이블 DROP TABLE 과 동일한 방식으로 삭제할 수 있습니다. 현재는 에지에서 참조하는 노드 삭제를 방지하는 메커니즘이 없습니다. 노드를 삭제하거나 전체 노드 테이블을 삭제할 때 가장자리의 연속 삭제는 지원되지 않습니다. 이러한 모든 경우 그래프의 일관성을 유지하려면 삭제된 노드에 연결된 모든 에지를 수동으로 삭제해야 합니다. |
DML(데이터 조작 언어) 문
작업 | 관련 문서 | 참고 |
---|---|---|
삽입 | INSERT(Transact-SQL) | 노드 테이블에 삽입하는 것은 관계형 테이블에 삽입하는 것과 다르지 않습니다. 열 값 $node_id 이 자동으로 생성됩니다. 값이나 $edge_id 열에 $node_id 값을 삽입하려고 하면 오류가 발생합니다. 에지 테이블에 삽입하는 동안 사용자는 열과 $to_id 값을 $from_id 제공해야 합니다. $from_id 지정된 $to_id $node_id 에지가 연결하는 노드의 값입니다. |
Delete | DELETE (Transact-SQL) | 노드 또는 에지 테이블의 데이터는 관계형 테이블에서 삭제되는 것과 같은 방식으로 삭제할 수 있습니다. 그러나 이 릴리스에서는 노드 삭제 시 에지가 삭제된 노드를 가리키지 않고 에지의 연속 삭제가 지원되지 않도록 하는 제약 조건이 없습니다. 노드가 삭제될 때마다 해당 노드에 연결하는 모든 에지도 삭제하는 것이 좋습니다. |
업데이트 | UPDATE(Transact-SQL) | UPDATE 문을 사용하여 사용자 정의 열의 값을 업데이트할 수 있습니다. 내부 그래프 열, $node_id $edge_id $from_id 및 .$to_id |
MERGE | MERGE(Transact-SQL) | MERGE 문은 노드 또는 에지 테이블에서 지원됩니다. |
쿼리 문
작업 | 관련 문서 | 참고 |
---|---|---|
선택 | SELECT(Transact-SQL) | 노드와 에지는 테이블로 저장되므로 대부분의 테이블 작업은 노드 및 에지 테이블에서도 지원됩니다. |
일치 | MATCH(Transact-SQL) | MATCH 기본 제공은 그래프를 통한 패턴 일치 및 순회를 지원하기 위해 도입되었습니다. |
제한 사항
노드 및 에지 테이블에는 다음과 같은 특정 제한 사항이 있습니다.
- 로컬 또는 전역 임시 테이블은 노드 또는 에지 테이블일 수 없습니다.
- 테이블 형식 및 테이블 변수는 노드 또는 에지 테이블로 선언할 수 없습니다.
- 노드 및 에지 테이블은 시스템 버전 임시 테이블로 만들 수 없습니다.
- 노드 및 에지 테이블은 메모리 최적화 테이블일 수 없습니다.
- 사용자는 UPDATE 문을 사용하여 에지의 열과
$to_id
열을 업데이트$from_id
할 수 없습니다. 에지에서 참조하는 노드를 업데이트하려면 사용자는 새 노드를 가리키는 새 에지를 삽입하고 이전 노드를 삭제해야 합니다. - 그래프 개체에 대한 데이터베이스 간 쿼리는 지원되지 않습니다.
참고 항목
다음 단계
- SQL Graph를 시작하려면 SQL Graph 데이터베이스 - 샘플을 참조 하세요.