Antes do comezo do curso
As bases de datos gráficas son unha tecnoloxía importante para os profesionais de bases de datos. Intento estar ao día das innovacións e novas tecnoloxías neste ámbito e, despois de traballar con bases de datos relacionais e NoSQL, vexo que o papel das bases de datos gráficas cobra cada vez máis importancia. Cando se traballa con datos xerárquicos complexos, non só as bases de datos tradicionais son ineficaces, senón tamén NoSQL. Moitas veces, a medida que aumenta o número de niveis de conexión e o tamaño da base de datos, o rendemento diminúe. E a medida que as relacións se fan máis complexas, o número de JOIN tamén aumenta.
Por suposto, o modelo relacional ten solucións para traballar con xerarquías (por exemplo, usando CTE recursivos), pero estas aínda son solucións alternativas. Ao mesmo tempo, a funcionalidade das bases de datos de gráficos de SQL Server permítelle xestionar facilmente varios niveis de xerarquía. Tanto o modelo de datos como as consultas simplifícanse, polo que aumenta a súa eficiencia. A cantidade de código redúcese significativamente.
As bases de datos gráficas son unha linguaxe expresiva para representar sistemas complexos. Esta tecnoloxía xa é moi utilizada na industria das TI en áreas como redes sociais, sistemas antifraude, análise de redes de TI, recomendacións sociais, recomendacións de produtos e contidos.
A funcionalidade da base de datos de gráficos en SQL Server é adecuada para escenarios nos que os datos están moi interconectados e teñen relacións ben definidas.
Modelo gráfico de datos
Un gráfico é un conxunto de vértices (nodos) e arestas (relacións, aresta). Os vértices representan entidades e as arestas representan relacións cuxos atributos poden conter información.
Unha base de datos de grafos modela entidades como gráficas como se define na teoría de grafos. As estruturas de datos son vértices e arestas. Os atributos son propiedades de vértices e arestas. Unha conexión é unha conexión de vértices.
A diferenza doutros modelos de datos, as bases de datos de gráficos priorizan as relacións entre entidades. Polo tanto, non hai necesidade de calcular relacións utilizando claves estranxeiras ou calquera outro medio. É posible crear modelos de datos complexos usando só abstraccións de vértices e bordos.
No mundo moderno, modelar relacións require técnicas cada vez máis complexas. Para modelar relacións, SQL Server 2017 ofrece capacidades de base de datos de gráficos. Os vértices e arestas do gráfico represéntanse como novos tipos de táboas: NODO e BORDE. As consultas gráficas usan unha nova función T-SQL chamada MATCH(). Dado que esta funcionalidade está integrada en SQL Server 2017, pódese usar nas bases de datos existentes sen necesidade de ningunha conversión.
Beneficios do modelo gráfico
Hoxe, as empresas e os usuarios demandan aplicacións que manexan cada vez máis datos, mentres esperan un alto rendemento e fiabilidade. Representar os datos como un gráfico ofrece un medio cómodo de manexar relacións complexas. Este enfoque resolve moitos problemas e axuda a obter resultados nun contexto determinado.
Parece que moitas aplicacións se beneficiarán do uso de bases de datos de gráficos no futuro.
Modelado de datos: do modelo relacional ao gráfico
Exemplo
Vexamos un exemplo dunha estrutura organizativa cunha xerarquía de empregados: un empregado reporta a un xestor, un xestor reporta a un alto directivo, etc. Dependendo da empresa específica, pode haber calquera número de niveis nesta xerarquía. Pero a medida que aumenta o número de niveis, o cálculo de relacións nunha base de datos relacional faise cada vez máis complexo. É bastante difícil imaxinar a xerarquía dos empregados, a xerarquía no marketing ou as conexións nas redes sociais. Vexamos como SQL Graph pode resolver o problema de manexar diferentes niveis de xerarquía.
Para este exemplo faremos un modelo de datos sinxelo. Imos crear unha táboa de empregados PMS con DNI EMPNO e columna M.G.R., indicando o identificador do supervisor (xerente) do empregado. Toda a información sobre a xerarquía gárdase nesta táboa e pódese consultar mediante columnas EMPNO и M.G.R..
O seguinte diagrama mostra o mesmo modelo de estrutura organizativa con catro niveis de aniñación nunha forma máis familiar. Os empregados son os vértices dunha gráfica dunha táboa PMS. A entidade "empregado" está conectada a si mesma pola conexión "envía" (ReportsTo). En termos gráficos, unha ligazón é un bordo (EDGE) que conecta os nós (NODE) dos empregados.
Imos crear unha táboa normal PMS e engade os valores alí de acordo co diagrama anterior.
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 seguinte imaxe mostra os empregados:
- empregado con EMPNO 7369 obedece 7902;
- empregado con EMPNO 7902 obedece a 7566
- empregado con EMPNO 7566 obedece a 7839
Agora vexamos unha representación gráfica dos mesmos datos. O vértice EMPLOYEE ten varios atributos e está conectado a si mesmo pola relación de "subordinados" (EmplReportsTo). EmplReportsTo é o nome da relación.
A táboa de bordos (EDGE) tamén pode conter atributos.
Imos crear unha táboa de nodos EmpNode
A sintaxe para crear un nodo é bastante sinxela: á expresión CREAR TÁBOA engádese ao final "COMO NODO".
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 imos converter os datos dunha táboa normal a unha gráfica. A continuación inserción insire datos dunha táboa relacional PMS.
INSERT INTO EmpNode(EMPNO,ENAME,MGR,DNO) select empno,ename,MGR,dno from emp
Na táboa de nós nunha columna especial $node_id_*
o identificador do nodo almacénase como JSON. As columnas restantes desta táboa conteñen os atributos do nodo.
Creando bordos (EDGE)
Crear unha táboa de borde é moi similar a crear unha táboa de nodos, agás que se usa a palabra clave "COMO BORDE".
CREATE TABLE empReportsTo(Deptno int) AS EDGE
Agora imos definir as conexións entre os empregados mediante columnas EMPNO и M.G.R.. O diagrama da estrutura organizativa mostra claramente como escribir inserción.
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 táboa de bordos predeterminada consta de tres columnas. Primeira, $edge_id
— identificador de borde en formato JSON. Os outros dous ($from_id
и $to_id
) representan a conexión entre nodos. Ademais, os bordos poden ter propiedades adicionais. No noso caso é Depto.
Vistas do sistema
Na vista do sistema sys.tables
apareceron dúas novas columnas:
- is_edge
- is_node
SELECT t.is_edge,t.is_node,*
FROM sys.tables t
WHERE name like 'emp%'
ssms
Os obxectos relacionados cos gráficos atópanse no cartafol Táboas gráficas. A icona da táboa de nodos está marcada cun punto e a icona da táboa de bordes está marcada con dous círculos conectados (un pouco como lentes).
expresión MATCH
Expresión XOGO tomado de CQL (Cypher Query Language). Esta é unha forma eficiente de consultar as propiedades dun gráfico. CQL comeza cunha expresión XOGO.
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
Exemplos
Vexamos algúns exemplos.
A seguinte consulta mostra os empregados aos que Smith e o seu director informan.
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 seguinte consulta é para atopar empregados e xestores de segundo nivel de Smith. Se eliminas a frase ONDE, entón o resultado mostrará todos os empregados.
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 por último, unha solicitude para empregados e directivos de terceiro nivel.
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 imos cambiar de dirección para conseguir os xefes 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)
Conclusión
SQL Server 2017 consolidouse como unha solución empresarial completa para varias tarefas empresariais de TI. A primeira versión de SQL Graph é moi prometedora. Aínda a pesar dalgunhas limitacións, xa hai funcionalidade suficiente para explorar as capacidades dos gráficos.
A funcionalidade de SQL Graph está totalmente integrada no motor SQL. Non obstante, como xa se indicou, SQL Server 2017 ten as seguintes limitacións:
Sen soporte de polimorfismo.
- Só se admiten conexións unidireccionais.
- Edges non pode actualizar as columnas $from_id e $to_id mediante UPDATE.
- Non se admiten os peches transitivos, pero pódense obter mediante CTE.
- A compatibilidade con obxectos OLTP na memoria é limitada.
- Non se admiten as táboas temporais (Táboa temporal con versión do sistema), as táboas locais e globais temporais.
- Os tipos de táboa e as variables de táboa non se poden declarar como NODE ou EDGE.
- Non se admiten consultas entre bases de datos.
- Non hai ningunha forma directa ou asistente de converter táboas normais en táboas gráficas.
- Non hai unha GUI para mostrar gráficos, pero podes usar Power BI.
Le máis:
Fonte: www.habr.com