Introdução aos bancos de dados de gráfico do SQL Server 2017

Antes do início do curso "Desenvolvedor MS SQL Server" Preparamos outra tradução útil para você.

Bancos de dados gráficos são uma tecnologia importante para profissionais de banco de dados. Procuro acompanhar as inovações e novas tecnologias nesta área e depois de trabalhar com bancos de dados relacionais e NoSQL, vejo que o papel dos bancos de dados gráficos está se tornando cada vez mais importante. Ao trabalhar com dados hierárquicos complexos, não apenas os bancos de dados tradicionais, mas também o NoSQL são ineficazes. Muitas vezes, com o aumento do número de níveis de link e do tamanho do banco de dados, ocorre uma queda no desempenho. E conforme os relacionamentos se tornam mais complexos, o número de JOINs também aumenta.

Obviamente, no modelo relacional existem soluções para trabalhar com hierarquias (por exemplo, usando CTEs recursivas), mas ainda são soluções alternativas. Ao mesmo tempo, a funcionalidade dos bancos de dados gráficos do SQL Server facilita o manuseio de vários níveis de hierarquia. Tanto o modelo de dados quanto as consultas são simplificados e, portanto, sua eficiência é aumentada. Reduz significativamente a quantidade de código.

Bancos de dados gráficos são uma linguagem expressiva para representar sistemas complexos. Esta tecnologia já é bastante utilizada na indústria de TI em áreas como redes sociais, sistemas antifraude, análise de redes de TI, recomendações sociais, recomendações de produtos e conteúdos.

A funcionalidade do banco de dados gráfico no SQL Server é adequada para cenários em que os dados são altamente interconectados e possuem relacionamentos bem definidos.

Modelo de dados do gráfico

Um grafo é um conjunto de vértices (nós, nó) e arestas (relacionamentos, aresta). Os vértices representam entidades e as arestas representam links cujos atributos podem conter informações.

Um banco de dados gráfico modela entidades como um gráfico conforme definido na teoria dos gráficos. Estruturas de dados são vértices e arestas. Atributos são propriedades de vértices e arestas. Uma conexão é uma conexão de vértices.

Ao contrário de outros modelos de dados, os bancos de dados gráficos priorizam os relacionamentos entre as entidades. Portanto, não há necessidade de calcular relacionamentos usando chaves estrangeiras ou de alguma outra forma. É possível criar modelos de dados complexos usando apenas abstrações de vértices e arestas.

No mundo de hoje, modelar relacionamentos requer técnicas cada vez mais sofisticadas. Para modelar relacionamentos, o SQL Server 2017 oferece recursos de banco de dados de gráficos. Os vértices e arestas do grafo são representados como novos tipos de tabelas: NODE e EDGE. As consultas de gráfico usam uma nova função T-SQL chamada MATCH(). Como essa funcionalidade é incorporada ao SQL Server 2017, ela pode ser usada em seus bancos de dados existentes sem a necessidade de qualquer conversão de banco de dados.

Benefícios do modelo gráfico

Hoje em dia, empresas e usuários exigem aplicativos que trabalhem com cada vez mais dados, esperando alto desempenho e confiabilidade. A representação gráfica de dados oferece um meio conveniente para lidar com relacionamentos complexos. Essa abordagem resolve muitos problemas e ajuda a obter resultados dentro de um determinado contexto.

Parece que muitos aplicativos se beneficiarão de bancos de dados gráficos no futuro.

Modelagem de dados: da modelagem relacional à modelagem gráfica

Introdução aos bancos de dados de gráfico do SQL Server 2017
Exemplo

Vejamos um exemplo de estrutura organizacional com uma hierarquia de funcionários: um funcionário se reporta a um gerente, um gerente se reporta a um gerente sênior e assim por diante. Dependendo da empresa específica, pode haver vários níveis nessa hierarquia. Porém, à medida que o número de níveis aumenta, o cálculo de relacionamentos em um banco de dados relacional torna-se cada vez mais difícil. É muito difícil imaginar a hierarquia dos funcionários, a hierarquia no marketing ou nas conexões de mídia social. Vamos ver como o SQL Graph pode resolver o problema de lidar com diferentes níveis de hierarquia.

Para este exemplo, vamos criar um modelo de dados simples. Criar uma tabela de funcionários EMP com id EMPNO e coluna MGRA que aponta para o ID do chefe (gerente) do funcionário. Todas as informações sobre a hierarquia são armazenadas nesta tabela e podem ser consultadas usando colunas EMPNO и MGR.

Introdução aos bancos de dados de gráfico do SQL Server 2017
O diagrama a seguir também mostra o mesmo modelo de organograma com quatro níveis de aninhamento de uma forma mais familiar. Funcionários são os vértices do gráfico da tabela EMP. A entidade "funcionário" está vinculada a si mesma pelo relacionamento "envia" (ReportsTo). Em termos grafos, um link é uma aresta (EDGE) que conecta nós (NODEs) de funcionários.

Introdução aos bancos de dados de gráfico do SQL Server 2017

Vamos criar uma tabela regular EMP e adicione valores lá de acordo com o diagrama acima.

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)

A figura abaixo mostra os funcionários:

  • empregado com EMPNO 7369 é subordinado a 7902;
  • empregado com EMPNO 7902 subordinado a 7566
  • empregado com EMPNO 7566 subordinado a 7839

Introdução aos bancos de dados de gráfico do SQL Server 2017
Agora vamos ver a representação dos mesmos dados na forma de um gráfico. O nó EMPLOYEE possui vários atributos e está vinculado a si mesmo por um relacionamento "envia" (EmplReportsTo). EmplReportsTo é o nome do relacionamento.

A tabela de borda (EDGE) também pode ter atributos.

Introdução aos bancos de dados de gráfico do SQL Server 2017
Crie uma tabela de nós EmpNode

A sintaxe para criar um nó é bastante simples: para a expressão CRIAR TABELA adicionado ao final COMO NÓ.

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

Agora vamos converter os dados de uma tabela regular para um gráfico. Próximo INSIRA insere dados de uma tabela relacional EMP.

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

Introdução aos bancos de dados de gráfico do SQL Server 2017
Na tabela de nós em uma coluna especial $node_id_* o ID do host é armazenado como JSON. As colunas restantes desta tabela contêm os atributos do nó.

Criar arestas (EDGE)

A criação de uma tabela de borda é muito semelhante à criação de uma tabela de nó, exceto que a palavra-chave COMO BORDA.

CREATE TABLE empReportsTo(Deptno int) AS EDGE

Introdução aos bancos de dados de gráfico do SQL Server 2017

Agora vamos definir relacionamentos entre funcionários usando colunas EMPNO и MGR. O organograma mostra claramente como escrever INSIRA.

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);

A tabela de borda tem três colunas por padrão. Primeiro, $edge_id — identificador de borda na forma de JSON. Os outros dois ($from_id и $to_id) representam o relacionamento entre nós. Além disso, as arestas podem ter propriedades adicionais. No nosso caso, isso Departamento.

Visualizações do sistema

Na visualização do sistema sys.tables Há duas novas colunas:

  1. is_edge
  2. é_node

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

Introdução aos bancos de dados de gráfico do SQL Server 2017

ssms

Os objetos relacionados a gráficos estão localizados na pasta Graph Tables. O ícone da tabela de nós é marcado com um ponto e o ícone da tabela de arestas é marcado com dois círculos conectados (que se parecem um pouco com óculos).

Introdução aos bancos de dados de gráfico do SQL Server 2017

expressão CORRESP

Expressão JOGO retirado do CQL (Cypher Query Language). Essa é uma maneira eficiente de consultar as propriedades de um gráfico. CQL começa com uma expressão JOGO.

sintaxe

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

Примеры

Vejamos alguns exemplos.

A consulta abaixo exibe os funcionários aos quais Smith e seu gerente se reportam.

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'

Introdução aos bancos de dados de gráfico do SQL Server 2017
A consulta a seguir é para encontrar funcionários e gerentes de segundo nível para Smith. Se você remover a oferta ONDE, todos os funcionários serão exibidos como resultado.

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'

Introdução aos bancos de dados de gráfico do SQL Server 2017
E, finalmente, um pedido para funcionários e gerentes de terceiro nível.

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'

Introdução aos bancos de dados de gráfico do SQL Server 2017
Agora vamos mudar de direção para pegar os chefes de 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)

Introdução aos bancos de dados de gráfico do SQL Server 2017

Conclusão

O SQL Server 2017 se estabeleceu como uma solução corporativa completa para uma variedade de necessidades de TI de negócios. A primeira versão do SQL Graph é muito promissora. Mesmo com algumas limitações, já existe funcionalidade suficiente para explorar as possibilidades dos gráficos.

A funcionalidade do SQL Graph é totalmente integrada ao SQL Engine. No entanto, como já mencionado, o SQL Server 2017 possui as seguintes limitações:

Sem suporte para polimorfismo.

  • Somente links unidirecionais são suportados.
  • As bordas não podem atualizar suas colunas $from_id e $to_id via UPDATE.
  • Fechamentos transitivos não são suportados, mas podem ser obtidos usando CTEs.
  • Suporte limitado para objetos OLTP na memória.
  • Tabelas temporais (Tabela Temporal com Versão do Sistema), tabelas temporárias locais e globais não são suportadas.
  • Tipos de tabela e variáveis ​​de tabela não podem ser declarados como NODE ou EDGE.
  • Consultas entre bancos de dados não são suportadas.
  • Não existe uma maneira direta ou algum tipo de assistente (assistente) para converter tabelas regulares em tabelas gráficas.
  • Não há GUI para exibir gráficos, mas o Power BI pode ser usado.

Introdução aos bancos de dados de gráfico do SQL Server 2017

Consulte Mais informação:

Fonte: habr.com

Adicionar um comentário