Antes do início do curso
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
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.
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.
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
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.
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
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
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:
- is_edge
- é_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
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).
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'
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'
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'
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)
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.
Consulte Mais informação:
Fonte: habr.com