SQL Server 2017图形数据库简介

“ MS SQL Server Developer”课程开始的前夕,我们为您准备了另一个有用的翻译。








图形数据库是数据库专业人员的一项重要技术。我尝试跟上该领域的创新和新技术,并且在使用关系数据库和NoSQL数据库之后,我发现图数据库的作用变得越来越重要。在处理复杂的分层数据时,不仅传统数据库无效,而且NoSQL无效。通常,随着链接级别的数量和基础大小的增加,性能会下降。随着关系变得越来越复杂,JOIN的数量也增加了。



当然,关系模型中有一些用于层次结构的解决方案(例如,使用递归CTE),但是这些仍然是解决方法。同时,SQL Server图形数据库的功能使您可以轻松处理层次结构的多个级别。数据模型和查询都得到简化,因此效率更高。代码量大大减少了。



图形数据库是一种表示复杂系统的表达语言。这项技术已经在IT行业广泛使用,例如社交媒体,反欺诈系统,IT网络分析,社交推荐,产品和内容推荐。



SQL Server中的图形数据库功能适用于数据紧密耦合并具有明确定义的关系的方案。



图数据模型



图是一组顶点(节点,节点)和边(关系,边)的集合。顶点表示实体,边表示其属性可以包含信息的链接。



图数据库按照图理论中的定义,以图的形式对实体进行建模。数据结构是顶点和边。属性是顶点和边的属性。链接是顶点的连接。



与其他数据模型不同,在图形数据库中,实体之间的关系优先。因此,无需使用外键或其他方式来计算关系。您可以仅使用顶点和边缘抽象来创建复杂的数据模型。



在现代世界中,建模关系需要越来越复杂的技术。对于建模关系,SQL Server 2017提供了图形数据库功能。图的顶点和边表示为新型表:NODE和EDGE。一个称为MATCH()的新T-SQL函数用于查询图形。由于此功能内置于SQL Server 2017中,因此可以在现有数据库中使用它而无需进行任何转换。



图模型的好处



如今,企业和用户都对要求越来越高的性能和可靠性的应用程序提出了越来越高的要求。图形形式的数据表示为处理复杂关系提供了方便的工具。这种方法解决了许多问题,并帮助您在给定的上下文中获得结果。



看起来,将来,许多应用程序将从图形数据库的使用中受益。



数据建模:从关系模型到图形模型





示例



让我们看一个具有员工层次结构的组织结构示例:员工向经理报告,经理向高级经理报告,依此类推。此层次结构可以具有任意数量的级别,具体取决于特定的公司。但是,随着级别数量的增加,关系数据库中的计算关系变得越来越困难。代表员工的层次结构,营销或社交媒体传播的层次结构相当困难。让我们看看SQL Graph如何解决处理层次结构不同级别的问题。



对于此示例,让我们建立一个简单的数据模型。让我们创建一个带有EMPNO标识符MGREMP员工表,指示员工的经理(经理)的标识符。有关层次结构的所有信息都存储在此表中,可以使用EMPNOMGR列查询





下图以更熟悉的形式显示了具有四个嵌套级别的相同组织结构图模型。员工是EMP表中图的顶点实体“雇员”通过链接“提交”(ReportsTo)链接到自身。用图的术语来说,链接是连接员工节点(NODE)的边缘(EDGE)。







让我们创建一个常规的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)


下图显示了员工:



  • EMPNO 7369的员工向7902报告;
  • EMPNO 7902的员工服从7566
  • EMPNO 7566的员工遵守7839




现在让我们看一下相同数据的图形表示。EMPLOYEE节点具有多个属性,并通过“服从”关系(EmplReportsTo)与自身关联。EmplReportsTo是关系的名称。



边缘表(EDGE)也可以包含属性。





创建EmpNode节点表创建节点



的语法非常简单:CREATE TABLE语句在末尾附加“ AS NODE”



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


现在,让我们将数据从常规表转换为图1。下一个INSERT插入EMP关系表中的数据



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




节点$node_id_*ID以JSON形式存储在节点表的特殊列中该表的其余列包含节点属性。



创建边缘(EDGE)



创建边缘表与创建节点表非常相似,除了使用关键字“ AS EDGE”



CREATE TABLE empReportsTo(Deptno int) AS EDGE






现在,使用列EMPNOMGR定义员工之间的关系组织结构图显示了如何编写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)表示节点之间的通信。另外,肋可以具有其他特性。在我们的例子中,这是Deptno



系统视图



系统视图中有sys.tables两个新列:



  1. is_edge
  2. is_node


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






短信服务



与图形相关的对象位于“图形表”文件夹中。节点表图标上标有一个点,边缘表图标上标有两个相连的圆圈(看起来有点像眼镜)。





匹配表达



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'




下一个查询是查找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'




最后,要求三级员工和经理。



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'




现在,让我们改变方向,以吸引史密斯的老板。



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已将自己确立为应对各种IT业务挑战的完整企业解决方案。SQL Graph的第一个版本非常有前途。尽管有一些限制,但已经有足够的功能来探索图的功能。



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



不支持多态。



  • .
  • $from_id $to_id UPDATE.
  • (transitive closure), CTE.
  • In-Memory OLTP.
  • (System-Versioned Temporal Table), .
  • NODE EDGE.
  • (cross-database queries).
  • - (wizard) .
  • GUI, Power BI.






:






All Articles