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;

现在让我们将数据从常规表格转换为图形表格。 下一个 插入 从关系表中插入数据 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 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 的员工和二级经理。 如果您删除优惠 , 则所有员工将作为结果显示。

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 图形数据库简介

阅读更多:

来源: habr.com

添加评论