SQL Server 2017 圖形數據庫簡介

課程開始前 “MS SQL Server 開發人員” 我們為您準備了另一個有用的翻譯。

圖數據庫是數據庫專業人員的一項重要技術。 我嘗試關注該領域的創新和新技術,在使用關係數據庫和 NoSQL 數據庫後,我看到圖形數據庫的作用越來越大。 在處理複雜的層次數據時,不僅傳統數據庫,NoSQL 也變得無效。 通常,隨著鏈接級別數量和數據庫大小的增加,性能會下降。 隨著關係變得越來越複雜,JOIN 的數量也會增加。

當然,在關係模型中有處理層次結構的解決方案(例如,使用遞歸 CTE),但這些仍然是變通方法。 同時,SQL Server圖形數據庫的功能使得處理多級層次變得容易。 簡化了數據模型和查詢,從而提高了效率。 顯著減少代碼量。

圖數據庫是一種表示複雜系統的表達語言。 這項技術已經在 IT 行業中得到相當廣泛的應用,例如社交網絡、反欺詐系統、IT 網絡分析、社交推薦、產品和內容推薦等領域。

SQL Server 中的圖形數據庫功能適用於數據高度互連且具有明確定義的關係的場景。

圖數據模型

圖是一組頂點(nodes,節點)和邊(relationships,edge)。 頂點代表實體,邊代錶鍊接,其屬性可以包含信息。

圖數據庫將實體建模為圖論中定義的圖。 數據結構是頂點和邊。 屬性是頂點和邊的屬性。 連接是頂點的連接。

與其他數據模型不同,圖形數據庫優先考慮實體之間的關係。 因此,無需使用外鍵或其他方式計算關係。 可以僅使用頂點和邊抽象來創建複雜的數據模型。

在當今世界,建模關係需要越來越複雜的技術。 為了對關係建模,SQL Server 2017 提供了圖形數據庫功能。 圖的頂點和邊表示為新類型的表:NODE 和 EDGE。 圖形查詢使用一個名為 MATCH() 的新 T-SQL 函數。 由於此功能內置於 SQL Server 2017 中,因此無需任何數據庫轉換即可在現有數據庫中使用。

圖模型的好處

如今,企業和用戶要求應用程序能夠處理越來越多的數據,同時期望高性能和可靠性。 數據的圖形表示為處理複雜關係提供了一種方便的方法。 這種方法解決了許多問題,並有助於在給定的上下文中獲得結果。

看起來很多應用程序將來都會受益於圖形數據庫。

數據建模:從關係建模到圖形建模

SQL Server 2017 圖形數據庫簡介
例子

讓我們看一個具有員工層次結構的組織結構示例:員工向經理報告,經理向高級經理報告,等等。 根據具體公司的不同,此層次結構中可以有任意數量的級別。 但是隨著層數的增加,計算關係數據庫中的關係變得越來越困難。 很難想像員工的等級制度、營銷或社交媒體關係中的等級制度。 讓我們看看 SQL Graph 如何解決處理不同級別層次結構的問題。

對於這個例子,讓我們做一個簡單的數據模型。 創建員工表 EMP 帶身份證 歐洲石油公司 和專欄 經理人指向員工負責人(經理)ID 的 。 有關層次結構的所有信息都存儲在該表中,可以使用列進行查詢 歐洲石油公司 и 經理人.

SQL Server 2017 圖形數據庫簡介
下圖還以更熟悉的形式顯示了具有四個嵌套級別的相同組織結構圖模型。 員工是表中圖的頂點 EMP. 實體“僱員”通過關係“提交”(ReportsTo) 鏈接到自身。 在圖形術語中,鏈接是連接員工節點 (NODE) 的邊 (EDGE)。

SQL Server 2017 圖形數據庫簡介

讓我們創建一個常規表 EMP 並根據上圖在那裡添加值。

CREATE TABLE EMP
(EMPNO INT NOT NULL,
ENAME VARCHAR(20),
JOB VARCHAR(10),
MGR INT,
JOINDATE DATETIME,
SALARY DECIMAL(7, 2),
COMMISIION DECIMAL(7, 2),
DNO INT)
 
INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902, '02-MAR-1970', 8000, NULL, 2),
(7499, 'ALLEN', 'SALESMAN', 7698, '20-MAR-1971', 1600, 3000, 3),
(7521, 'WARD', 'SALESMAN', 7698, '07-FEB-1983', 1250, 5000, 3),
(7566, 'JONES', 'MANAGER', 7839, '02-JUN-1961', 2975, 50000, 2),
(7654, 'MARTIN', 'SALESMAN', 7698, '28-FEB-1971', 1250, 14000, 3),
(7698, 'BLAKE', 'MANAGER', 7839, '01-JAN-1988', 2850, 12000, 3),
(7782, 'CLARK', 'MANAGER', 7839, '09-APR-1971', 2450, 13000, 1),
(7788, 'SCOTT', 'ANALYST', 7566, '09-DEC-1982', 3000, 1200, 2),
(7839, 'KING', 'PRESIDENT', NULL, '17-JUL-1971', 5000, 1456, 1),
(7844, 'TURNER', 'SALESMAN', 7698, '08-AUG-1971', 1500, 0, 3),
(7876, 'ADAMS', 'CLERK', 7788, '12-MAR-1973', 1100, 0, 2),
(7900, 'JAMES', 'CLERK', 7698, '03-NOV-1971', 950, 0, 3),
(7902, 'FORD', 'ANALYST', 7566, '04-MAR-1961', 3000, 0, 2),
(7934, 'MILLER', 'CLERK', 7782, '21-JAN-1972', 1300, 0, 1)

下圖顯示了員工:

  • 員工與 歐洲石油公司 7369隸屬於7902;
  • 員工與 歐洲石油公司 7902隸屬於7566
  • 員工與 歐洲石油公司 7566隸屬於7839

SQL Server 2017 圖形數據庫簡介
現在讓我們看看以圖形形式表示的相同數據。 EMPLOYEE 節點有幾個屬性,並通過“提交”關係 (EmplReportsTo) 鏈接到自身。 EmplReportsTo 是關係的名稱。

邊緣表 (EDGE) 也可能具有屬性。

SQL Server 2017 圖形數據庫簡介
創建節點表 EmpNode

創建節點的語法非常簡單:表達式 創建表 添加到最後 作為節點.

CREATE TABLE dbo.EmpNode(
ID Int Identity(1,1),
EMPNO NUMERIC(4) NOT NULL,
ENAME VARCHAR(10),
MGR NUMERIC(4),
DNO INT
) AS NODE;

現在讓我們將數據從常規表格轉換為圖形表格。 下一個 INSERT 從關係表中插入數據 EMP.

INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp

SQL Server 2017 圖形數據庫簡介
在特殊列的節點表中 $node_id_* 主機 ID 存儲為 JSON。 該表的其餘列包含節點的屬性。

創建邊 (EDGE)

創建邊緣表與創建節點表非常相似,除了關鍵字 作為邊緣.

CREATE TABLE empReportsTo(Deptno int) AS EDGE

SQL Server 2017 圖形數據庫簡介

現在讓我們使用列定義員工之間的關係 歐洲石油公司 и 經理人. 組織結構圖清楚地顯示瞭如何編寫 INSERT.

INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 1),
   	(SELECT $node_id FROM EmpNode WHERE id = 13),20);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 2),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),10);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 3),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),10)
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 4),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 5),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 6),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 7),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 8),
   	(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 9),
   	(SELECT $node_id FROM EmpNode WHERE id = 9),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 10),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 11),
   	(SELECT $node_id FROM EmpNode WHERE id = 8),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 12),
   	(SELECT $node_id FROM EmpNode WHERE id = 6),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 13),
   	(SELECT $node_id FROM EmpNode WHERE id = 4),30);
INSERT INTO empReportsTo  VALUES ((SELECT $node_id FROM EmpNode WHERE ID = 14),
   	(SELECT $node_id FROM EmpNode WHERE id = 7),30);

默認情況下,邊緣表具有三列。 第一的, $edge_id — JSON 形式的邊緣標識符。 另外兩個($from_id и $to_id) 表示節點之間的關係。 此外,邊可以有額外的屬性。 在我們的例子中,這個 部門號.

系統視圖

在系統視圖中 sys.tables 有兩個新列:

  1. 是邊
  2. 是_節點

SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'

SQL Server 2017 圖形數據庫簡介

安全管理系統

與圖形相關的對象位於 Graph Tables 文件夾中。 節點表圖標用一個點標記,邊緣表圖標用兩個相連的圓圈標記(看起來有點像眼鏡)。

SQL Server 2017 圖形數據庫簡介

匹配表達式

表達 MATCH 取自 CQL(密碼查詢語言)。 這是查詢圖形屬性的有效方法。 CQL 以表達式開頭 MATCH.

句法

MATCH (<graph_search_pattern>)
 
<graph_search_pattern>::=
    {<node_alias> {
                 	{ <-( <edge_alias> )- }
               	| { -( <edge_alias> )-> }
             	<node_alias>
             	}
 	}
 	[ { AND } { ( <graph_search_pattern> ) } ]
 	[ ,...n ]
 
<node_alias> ::=
    node_table_name | node_alias
 
<edge_alias> ::=
    edge_table_name | edge_alias

Примеры

讓我們看幾個例子。

下面的查詢顯示了 Smith 和他的經理向其報告的員工。

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR
FROM
    empnode e, empnode e1, empReportsTo m
WHERE
    MATCH(e-(m)->e1)
and e.ENAME='SMITH'

SQL Server 2017 圖形數據庫簡介
以下查詢用於查找 Smith 的員工和二級經理。 如果您刪除優惠 WHERE, 則所有員工將作為結果顯示。

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2
WHERE
    MATCH(e-(m)->e1-(m1)->e2)
and e.ENAME='SMITH'

SQL Server 2017 圖形數據庫簡介
最後,對三級員工和經理的要求。

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
    MATCH(e-(m)->e1-(m1)->e2-(m2)->e3)
and e.ENAME='SMITH'

SQL Server 2017 圖形數據庫簡介
現在讓我們改變方向來獲得 Smith 的老闆。

SELECT
E.EMPNO,E.ENAME,E.MGR,E1.EMPNO,E1.ENAME,E1.MGR,E2.EMPNO,e2.ENAME,E2.MGR,E3.EMPNO,e3.ENAME,E3.MGR
FROM
    empnode e, empnode e1, empReportsTo m ,empReportsTo m1, empnode e2, empReportsTo M2, empnode e3
WHERE
    MATCH(e<-(m)-e1<-(m1)-e2<-(m2)-e3)

SQL Server 2017 圖形數據庫簡介

結論

SQL Server 2017 已成為滿足各種業務 IT 需求的完整企業解決方案。 SQL Graph 的第一個版本非常有前途。 儘管存在一些限制,但已經有足夠的功能來探索圖形的可能性。

SQL Graph 功能已完全集成到 SQL 引擎中。 但是,如前所述,SQL Server 2017 具有以下限制:

不支持多態性。

  • 僅支持單向鏈接。
  • 邊無法通過 UPDATE 更新它們的 $from_id 和 $to_id 列。
  • 不支持傳遞閉包,但可以使用 CTE 獲得它們。
  • 對內存中 OLTP 對象的有限支持。
  • 不支持時態表(System-Versioned Temporal Table)、臨時本地表和全局表。
  • 表類型和表變量不能聲明為 NODE 或 EDGE。
  • 不支持跨數據庫查詢。
  • 沒有直接的方法或某種嚮導(wizard)可以將常規表轉換為圖形表。
  • 沒有顯示圖形的 GUI,但可以使用 Power BI。

SQL Server 2017 圖形數據庫簡介

閱讀更多:

來源: www.habr.com

添加評論