Como usar Graph Tables en SQL Server

Usando Graph Tables

Aplica para SQL Server 2017

SQL Server 2017 permite manejar las relaciones entre tabla de cuya cardinalidad es de muchos a muchos con las opciones de Graph Tables, se pueden manejar de manera clásica creando una tabla adicional para las relaciones de muchos a muchos.

SQL Server 2017 provee el concepto de base de datos gráfica, con tablas Node y tablas Edge donde se insertan las relaciones.

Conceptos básicos

  • Una base de datos gráfica es una colección de nodos (o vértices) y bordes (o relaciones).
  • Un nodo representa una entidad (por ejemplo, una persona o una organización) y un borde representa una relación entre los dos nodos que conecta (por ejemplo, grupos o amigos). Tanto los nodos como los bordes pueden tener propiedades asociadas a ellos.



Características de los Graph Tables

  • Los bordes o las relaciones son entidades de primera clase en una base de datos gráfica y pueden tener atributos o propiedades asociadas.
  • Un solo borde puede conectar de forma flexible varios nodos en una base de datos de gráficos.
  • Puede expresar la coincidencia de patrones y las consultas de navegación de múltiples saltos fácilmente.
  • Puede expresar cierre transitivo y consultas polimórficas fácilmente.

Cuando usar una base de datos gráfica

No hay nada que una base de datos gráfica pueda lograr, lo que no se puede lograr utilizando una base de datos relacional. Sin embargo, una base de datos gráfica puede hacer que sea más fácil expresar cierto tipo de consultas. Además, con optimizaciones específicas, ciertas consultas pueden tener un mejor desempeño.

Factores para decidir usar una base de datos gráfica

  • Su aplicación tiene datos jerárquicos. El tipo de datos HierarchyID se puede usar para implementar jerarquías, pero tiene algunas limitaciones. Por ejemplo, no le permite almacenar varios padres para un nodo.
  • Su aplicación tiene relaciones complejas de muchos a muchos; A medida que la aplicación evoluciona,
  • se agregan nuevas relaciones.
  • Necesitas analizar datos y relaciones interconectadas.

Restricciones Edge

  • Una restricción de Edge se define en una tabla Edge de gráfico y es un par de tablas Node que un tipo de Edge determinado puede conectar. Esto le da a los usuarios un mejor control sobre su esquema gráfico.
  • Con la ayuda de restricciones Edge, los usuarios pueden restringir el tipo de nodos
  • a los que se permite conectar un borde determinado.

Cláusulas de restricción Edge

  • Cada restricción Edge consta de una o más cláusulas de restricción Edge.
  • Una cláusula de restricción Edge es el par de nodos FROM y TO que el Edge dado podría conectar.
  • Tenga en cuenta que tiene nodos de Producto y Cliente en su gráfico y que utiliza
  • la restricción Venta Edge para conectar estos nodos.
  • La cláusula de restricción Edge especifica el par de nodos FROM y TO y la dirección del borde.
  • En este caso, la cláusula de restricción de borde será Cliente A Producto. Es decir,
  • se permitirá la inserción de un Venta que va de un Cliente a un Producto.
  • Los intentos de insertar un borde que va del Producto al Cliente fallan.
  • Una cláusula de restricción Edge contiene un par de tablas de nodo FROM y TO en las que
  • se aplica la restricción de borde.
  • Si se crean múltiples restricciones de borde en una sola tabla de borde,
  • los bordes deben satisfacer TODAS las restricciones para ser permitidos.

Limitaciones en el uso de Graph Tables

  • Las tablas temporales locales o globales no pueden ser tablas de nodo o borde.
  • Los tipos de tabla y las variables de tabla no se pueden declarar como una tabla de nodo o borde. (Ver Variables tipo Tabla)
  • Las tablas de nodo y borde no se pueden crear como tablas temporales con versión del sistema.
  • Las tablas de nodo y borde no pueden ser tablas de memoria optimizada.
  • Los usuarios no pueden actualizar las columnas $ from_id y $ to_id de un borde utilizando la instrucción UPDATE. (Ver actualización de registros)
  • Para actualizar los nodos que conecta un borde, los usuarios deberán insertar el nuevo borde que apunta a nuevos nodos y eliminar el anterior.
  • No se admiten consultas cruzadas de base de datos en objetos de gráficos.

Ejercicio desarrollado

Usando la base de datos Northwind, se va a crear dos Graph Tables, una para Personas, que va a ser el Nodo, y otra para Grupos, que será el Edge (Vértice) que tendrá las relaciones entre las personas.

use Northwind
go
Tablas tipo gráfico para relaciones muchos a muchos
Crear una tabla Node para Personas

Create table dbo.Personas
(
PersonasID int,
PersonasCodigo nchar(3), PersonasPaterno nvarchar(100),
PersonasMaterno nvarchar(100),PersonasNombre nvarchar(100),
PersonasFechaNacimiento Date,
constraint PersonasPK Primary key (PersonasID)
) As Node
go
Insertar registros en la tabla Personas, note que se ha especificado
un campo código adicional a la PK. (Ver creación de tablas)

insert into Personas
values (1,’059′,’Luque’,’Sanchez’,’Fernando’,’23/07/1966′),
(2,’105′,’Pereda’,’Mendoza’,’Carlos’,’24/02/1996′),
(3,’078′,’Chavez’,’Alvarado’,’Ingrid’,’30/12/1994′),
(4,’450′,’Campos’,’Castro’,’Mario’,’16/06/1986′)
go
El resultado se puede notar en la siguiente figura
select * from Personas
go

Registros de la tabla Node Personas

Crear una tabla Edge para las relaciones entre personas
Create table Grupos
(
GrupoFormacion Date
) As Edge
go

Insertar relaciones
La relación entre personas se forman con dos instrucciones select que representan las partes From y To de la relación.En cada instrucción se debe extraer el dato que representa al nodo usando la función $node_id.



Relación entre las personas con código 105, Carlos Pereda Mendoza y la que tiene el código 078, Ingrid Chavez Alvarado.
insert into Grupos values
((Select $node_id from Personas where PersonasCodigo = ‘105’),
(Select $node_id from Personas where PersonasCodigo = ‘078’),’21/01/2019′)
go
Insertar mas relaciones entre personas
insert into Grupos values
((Select $node_id from Personas where PersonasCodigo = ‘078’),
(Select $node_id from Personas where PersonasCodigo = ‘450’),’08/12/2018′)
go
insert into Grupos values
((Select $node_id from Personas where PersonasCodigo = ‘059’),
(Select $node_id from Personas where PersonasCodigo = ‘105’),’13/01/2019′)
go
insert into Grupos values
((Select $node_id from Personas where PersonasCodigo = ‘105’),
(Select $node_id from Personas where PersonasCodigo = ‘059’),’23/11/2018′)
go

Ver el contenido de la tabla Edge Grupos
select * from Grupos
go

Registros de la tabla Edge.

Para visualizar las relaciones de Carlos Pereda (Cód. 105)
Select P2.PersonasPaterno, P2.PersonasMaterno,
P2.PersonasNombre, G.GrupoFormacion
from Personas As P1, Grupos As G, Personas As P2
where match(P1-(G)->P2)
and P1.PersonasCodigo = ‘105’
go

Relaciones de Carlos Pereda, código 105