A série até agora:

  1. o SQL Server Gráfico de Bancos de dados – Parte 1: Introdução
  2. SQL Server Bases de dados de gráficos – Parte 2: a Consulta de Dados em um Gráfico de Banco de dados
  3. SQL Server Gráfico de Bancos de dados – Parte 3: Modificação de Dados em um Gráfico de Banco de dados
  4. SQL Server Bases de dados de gráficos – Parte 4: Trabalhando com dados hierárquicos em um gráfico de banco de dados
  5. SQL Server Bases de dados de gráficos – Parte 5: A importação de Dados Relacionais em um Gráfico de Banco de dados

Com o lançamento do SQL Server 2017, a Microsoft adicionou suporte para bases de dados de gráficos para melhor lidar com conjuntos de dados que contêm o complexo de relações entre entidades, tais como o tipo de dados gerados por um site de mídia social, onde você pode ter uma mistura de muitos-para-muitos relacionamentos que mudam com frequência. Os bancos de dados Graph usam as mesmas estruturas de tabela encontradas nos bancos de dados tradicionais do SQL Server e suportam as mesmas ferramentas e instruções T-SQL, mas também incluem recursos para armazenar e navegar em relacionamentos complexos.

este artigo é o primeiro de uma série sobre bancos de dados SQL Server graph. O artigo apresenta conceitos básicos de gráficos e demonstra como criar e preencher tabelas gráficas, usando o SQL Server Management Studio (SSMS) e uma instância local do SQL Server 2017. Nos artigos a seguir, vamos analisar como consultar um banco de dados gráfico e modificar seus dados, mas para este artigo, estamos começando com o básico.

o banco de dados de gráficos do SQL Server

os bancos de dados de gráficos do SQL Server podem ajudar a simplificar o processo de modelagem de dados que contém relacionamentos complexos de muitos para muitos e hierárquicos. No seu mais básico, um banco de dados gráfico é uma coleção de nós e arestas que trabalham juntos para definir vários tipos de relacionamentos. Um nó é uma entidade como uma pessoa ou local. Uma vantagem é uma relação entre duas entidades. Por exemplo, um relacionamento pode existir entre um local como Toledo e uma pessoa chamada Chris, que mora em Toledo. Chris e Toledo são as entidades, e’ vive ‘ é a relação entre os dois.

uma tabela de nó no SQL Server é uma coleção de entidades semelhantes, e uma tabela de borda é uma coleção de relações semelhantes. Para ajudar a entender como isso funciona, considere o modelo gráfico mostrado na figura a seguir, que é baseado em um fórum fictício de amantes de peixes. O modelo inclui três nós (FishSpecies, FishLover, e FishPost) e três arestas (Likes, Posts, e LinksTo).

Os retângulos representam os nós e as setas que conectam os nós representam as arestas, com as setas apontando na direção do relacionamento. Por exemplo, as bordas de curtidas podem definir qualquer um dos seguintes relacionamentos:

  • um amante de peixes gosta de uma espécie de peixe.
  • um amante de peixes gosta de um post sobre peixes.
  • um amante de peixes gosta de outro amante de peixes.

você pode representar todos os três relacionamentos como dados em uma única tabela de borda no banco de dados do gráfico, com cada relacionamento em sua própria linha. Uma tabela de nó funciona da mesma maneira, exceto que inclui uma linha para cada entidade. Você também pode associar propriedades a nós e arestas. Uma propriedade é um atributo de valor-chave que é definido como uma coluna em um nó ou tabela de borda. Por exemplo, o nó FishSpecies pode incluir propriedades para armazenar os nomes comuns e científicos de cada espécie. As propriedades são criadas como colunas definidas pelo usuário na tabela FishSpecies. Ao criar uma tabela de nó, você deve incluir pelo menos uma propriedade.

para a maioria das operações, as tabelas de nó e borda funcionam como qualquer outra tabela definida pelo usuário do SQL Server. Embora existam algumas limitações—como não ser capaz de declarar tabelas temporárias ou variáveis de tabela como tabelas de nó ou borda-na maioria das vezes você descobrirá que trabalhar com tabelas de gráfico será um território familiar.

onde as coisas ficam um pouco obscuras é com o próprio banco de dados gráfico. Embora o nome possa sugerir que você está criando um novo tipo de objeto de banco de dados, Esse não é o caso. Um banco de dados gráfico é apenas uma construção lógica definida dentro de um banco de dados definido pelo usuário, que não pode suportar mais de um banco de dados gráfico. A existência do banco de dados gráfico é relativamente transparente do lado de fora e, na maior parte, não é algo com o qual você precisa se preocupar. Ao trabalhar com bancos de dados de gráficos, seu foco principal estará nas tabelas de gráficos e nos dados que eles contêm.

em geral, um banco de dados gráfico não fornece recursos que você não pode alcançar usando recursos relacionais tradicionais. A promessa do banco de dados gráfico reside em poder organizar e consultar certos tipos de dados com mais eficiência. A Microsoft recomenda que você considere implementar um banco de dados graph nas seguintes circunstâncias:

  • você precisa analisar dados altamente interconectados e as relações entre esses dados.
  • você está apoiando dados com relacionamentos complexos de muitos para muitos que estão em constante evolução.
  • você está trabalhando com dados hierárquicos, enquanto tenta navegar pelas limitações do tipo de dados HierarchyID.

os recursos do banco de dados graph do SQL Server estão totalmente integrados ao mecanismo de banco de dados, aproveitando componentes como o processador de consulta e o mecanismo de armazenamento. Devido a essa integração, você pode usar bancos de dados de gráficos em conjunto com uma ampla gama de componentes, incluindo índices columnstore, Serviços de aprendizado de máquina, SSMS e vários outros recursos e ferramentas.

definindo tabelas de nó gráfico

para criar um banco de dados gráfico com base no modelo mostrado na figura anterior, você deve criar três tabelas de nó e três tabelas de borda. A Microsoft atualizou a instrução CREATE TABLE no SQL Server 2017 para incluir opções para definir qualquer tipo de tabela. Como já foi observado, você pode criar as tabelas em qualquer banco de dados definido pelo Usuário. Para os exemplos deste artigo, criei uma base de dados básicos nome FishGraph, como mostrado no seguinte código T-SQL:

1
2
3
4
5
6

USE master;
IR p
DROP DATABASE SE EXISTE FishGraph;
IR p
CRIAR BANCO de dados FishGraph;
IR

Como você pode ver, não há nada de especial acontecendo aqui. Você cria o banco de dados como qualquer outro banco de dados definido pelo Usuário. Não há nada de especial que você precisa fazer para configurá-lo para suportar um banco de dados gráfico.

se você planeja experimentar esses exemplos por si mesmo, pode usar o banco de dados FishGraph ou um de sua escolha. O que quer que você decida, o próximo passo é criar a tabela de nós FishSpecies, usando a seguinte instrução CREATE TABLE:

1
2
3
4
5
6
7
8
9

USE FishGraph;
IR p
DROP TABLE IF EXISTS FishSpecies;
IR p
CRIAR TABELA FishSpecies (
FishID INT IDENTIDADE de CHAVE PRIMÁRIA,
CommonName NVARCHAR(100) not NULL,
ScientificName NVARCHAR(100) not NULL
) COMO NÓ;

as definições da coluna devem ser bastante diretas. O que é importante aqui é a cláusula AS NODE, que você deve incluir para criar uma tabela de nós. Quando você especifica essa cláusula, o mecanismo de banco de dados adiciona duas colunas à tabela (às quais chegaremos em breve) e cria um índice exclusivo e não agrupado em uma dessas colunas.

você pode verificar se a tabela foi criada como uma tabela de nó consultando o sistema.vista das tabelas. Com o lançamento do SQL Server 2017, A Microsoft atualizou a visualização para incluir as colunas de bits is_node e is_edge. Se a tabela for uma tabela de nó, o valor da coluna is_node será definido como 1 e o valor da coluna is_edge será definido como 0. Se uma tabela de borda, os valores são invertidos. O exemplo a seguir usa o modo de exibição para confirmar que o FishSpecies tabela foi definida corretamente:

1
2

SELECIONE is_node, is_edge DE sys.tabelas
onde name = ‘FishSpecies’;

A instrução SELECT retorna os resultados mostrados na figura a seguir, que indicam que FishSpecies foi criada como uma tabela de nós.

a Microsoft também atualizou o sistema.as colunas são exibidas para incluir as colunas graph_type e graph_type_desc. Você pode usar o modo de exibição e novas colunas para saber mais sobre o FishSpecies tabela:

1
2
3

SELECT nome, graph_type, graph_type_desc
FROM sys.colunas
ONDE object_id = OBJECT_ID(‘FishSpecies’);

a figura A seguir mostra as colunas criadas para o FishSpecies tabela.

Quando você cria um nó de tabela, o mecanismo de banco de dados adiciona o graph_id_<hex_string> e $node_id_<hex_string> colunas e cria uma única, índice não agrupado em us $node_id coluna. O mecanismo de banco de dados usa a primeira coluna para operações internas e disponibiliza a segunda coluna para acesso externo. A coluna $ node_id armazena um identificador exclusivo para cada entidade, que você pode visualizar ao consultar os dados. Esta é a única coluna com a qual você precisa se preocupar. Na verdade, se você consultasse a tabela diretamente, veria apenas a coluna $node_id, não a coluna graph_id.

as colunas graph_type e graph_type_desc retornadas pelos sistemas.a visualização de colunas é específica para as colunas geradas automaticamente em uma tabela gráfica. As colunas indicam os tipos de colunas que o mecanismo de banco de dados gerou. O tipo é indicado por um valor numérico predefinido e sua descrição relacionada. A Microsoft não fornece muitos detalhes sobre esses códigos e Descrições, mas você pode encontrar alguns detalhes na arquitetura do Microsoft document SQL Graph. Novamente, sua principal preocupação é com a coluna $ node_id e os dados que ela contém.

depois de criar sua tabela, você pode começar a adicionar dados. Executar uma instrução INSERT em uma tabela de nó funciona como qualquer outra tabela. Você especifica as colunas de destino e seus valores, conforme mostrado no exemplo a seguir:

1
2
3
4
5
6
7
8
9
10
11

INSERT INTO FishSpecies (CommonName, ScientificName) VALUES
(‘Atlantic halibut’, ‘Hippoglossus hippoglossus’),
(‘Chinook salmon’, ‘Oncorhynchus tshawytscha’),
(‘European seabass’, ‘Morone (Decentrarchus) labrax’),
(‘Gizzard shad’, ‘Dorosoma cepedianum’),
(‘Japanese striped knife jaw’, ‘Oplegnathus faciatus’),
(‘Northern pike’, ‘Esox lucius’),
(‘Pacífico arenque’, ‘Clupea pallasi’),
(‘a truta arco-íris’, ‘Oncorhynchus mykiss’),
(‘Sole (Dover)’, ‘Solea solea’),
(‘Branco bass’, ‘Morone chrysops’);

claro, você pode adicionar qualquer espécie de peixe tem um gosto especial para. Minhas escolhas aqui eram completamente arbitrárias. Mas se você ficar com meus dados e, em seguida, consultar a tabela FishSpecies, seus resultados devem ser semelhantes aos da figura a seguir.

como mencionado acima, a coluna graph_id não aparece nos resultados, mas a coluna $node_id, completa com valores gerados automaticamente. O mecanismo de banco de dados cria cada valor como uma string JSON que fornece o tipo (nó ou borda), esquema, tabela e um valor BIGINT exclusivo para cada linha. Como esperado, o mecanismo de banco de dados também retorna os valores nas colunas definidas pelo usuário, assim como uma tabela relacional típica.

o próximo passo é criar e preencher a tabela de nós FishLover, usando o seguinte código T-SQL:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE IF EXISTS FishLover;
IR p
CRIAR TABELA FishLover (
FishLoverID INT IDENTIDADE de CHAVE PRIMÁRIA,
nome de usuário NVARCHAR(50) not NULL,
) COMO NÓ;
INSERT INTO FishLover (nome de usuário) VALORES
(‘powerangler’),
(‘jessie98’),
(‘viciado’),
(‘deepdive’),
(‘underwatercasey’);

A tabela inclui apenas duas colunas definidas pelo usuário—FishLoverID e nome de usuário, mas você pode definir quantas colunas conforme necessário. Por exemplo, você pode querer incluir nomes e sobrenomes, informações de contato e outros detalhes, dependendo da natureza do aplicativo. Depois de criar a tabela, você pode executar uma consulta para verificar os dados. Seus resultados devem ser semelhantes aos mostrados na figura a seguir.

Você pode, em seguida, siga as mesmas etapas para criar e preencher o FishPost tabela, passando em qualquer mensagem de texto que você deseja:

1
2
3
4
5
6
7
8
9
10
11
12
13

DROP TABLE IF EXISTS FishPost;
IR p
CRIAR TABELA FishPost (
PostID INT IDENTIDADE de CHAVE PRIMÁRIA,
Título NVARCHAR(50) not NULL,
MessageText NVARCHAR(800) not NULL
) COMO NÓ;
INSERT INTO FishPost (Título, MessageText) VALORES
(‘The one that got away’, “A nossa equipe está disponível, por favor contacte-nos. Aeneas vantagem necessidades reservadas.’),
(‘um estudo sobre peixes’, ‘ penatibus venenatis, nascetur ridiculus mus.’),
(‘Anzol, linha e chumbada ‘, ‘Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.’),
(‘tantos peixes, tão pouco tempo’, ‘ nullam dictum felis eu pede mollis pretium. Inteiro tincidunt.’),
(‘meu peixe favorito’, ‘ Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.’);

a figura a seguir mostra os resultados que você veria se mantivesse os dados Lorem Ipsum.

isso é tudo o que há para criar e preencher suas tabelas de nós. Exceto pela cláusula AS NODE na instrução CREATE TABLE, a maioria de tudo o resto é business as usual.

definir tabelas de borda do Gráfico

criar uma tabela de borda é semelhante à criação de uma tabela de nó, exceto que você deve especificar a cláusula AS EDGE em vez da cláusula AS NODE. Por exemplo, para criar a tabela Posts, você poderia usar a seguinte instrução CREATE TABLE:

1
2
3
4
5

DROP TABLE IF EXISTS Posts;
IR p
CRIAR TABELA de Cargos (
ImportantFlag BIT not NULL DEFAULT 0
) COMO EDGE;

A definição da tabela é semelhante a um nó de tabela, exceto que ele não inclui uma coluna de chave primária (e, é claro, leva a BORDA cláusula). Nesse caso, uma chave primária não é necessária, mas se em algum momento você determinar que precisa de uma chave primária, certamente poderá adicionar uma. (Você verá em breve por que as chaves primárias são úteis para as tabelas de nós.)

observe que a definição da tabela também inclui a coluna ImportantFlag. Incluí isso principalmente para demonstrar que você pode adicionar colunas definidas pelo usuário à sua tabela de borda, assim como nas tabelas de nó. Dito isto, não é incomum criar uma tabela de borda sem colunas definidas pelo usuário, ao contrário de uma tabela de nó, que deve incluir pelo menos uma coluna definida pelo Usuário.

depois de criar a tabela edge, você pode verificar se ela foi definida corretamente consultando o sistema.tables view, como você viu anteriormente:

1
2

SELECIONE is_node, is_edge DE sys.tabelas
onde name = ‘Posts’;

se você fez tudo certo, seus resultados devem ser semelhantes aos da figura a seguir.

você também pode consultar o sistema.as tabelas são exibidas para verificar os detalhes da coluna, assim como você fez antes:

1
2
3

SELECT nome, graph_type, graph_type_desc
FROM sys.colunas
ONDE object_id = OBJECT_ID(‘Posts’);

a figura A seguir mostra os resultados retornados no meu sistema.

como você pode ver, o mecanismo de banco de dados adiciona oito colunas a uma tabela de borda, em vez das duas que você viu com tabelas de nó. Novamente, consulte o documento SQL Graph Architecture para descrições de cada tipo de coluna. Essa maioria dessas colunas é usada pelo mecanismo de banco de dados para operações internas. Você precisa se preocupar principalmente com as três colunas a seguir:

  • a coluna $ edge_id_<hex_string> identifica exclusivamente cada relacionamento.
  • a coluna $from_id_<hex_string> armazena o valor $node_id associado à entidade na tabela onde o relacionamento se origina.
  • a coluna $to_id_< hex_string > armazena o valor $node_id associado à entidade na tabela onde o relacionamento termina.

tal como acontece com a coluna $node_id em uma tabela de nó, o mecanismo de banco de dados gera automaticamente valores para a coluna $edge_id. No entanto, você deve adicionar valores especificamente às colunas $from_id e $to_id para definir um relacionamento. Para demonstrar como isso funciona, começaremos com um único registro:

1
2
3

INSERIR EM Postos ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 1),
(SELECCIONE $node_id DE FishPost ONDE PostID = 3));

A instrução INSERT é a definição de uma relação na tabela Posts entre um FishLover entidade cuja FishLoverID valor é 1 e um FishPost entidade cuja PostID valor é 3. Observe que você pode usar os aliases $node_id, $from_id e $to_id para fazer referência às colunas de destino, sem ter que criar as strings hexadecimais.

para adicionar dados à coluna $from_id, você deve especificar o valor $ node_id associado à entidade FishLover. Uma maneira de obter esse valor é incluir uma subconsulta que tem como alvo a entidade, usando seu valor de chave primária. Você pode usar a mesma abordagem para a coluna $from_id.

inserir os dados dessa maneira demonstra por que é útil adicionar chaves primárias às tabelas de nós, mas não é necessário para as tabelas de borda. As chaves primárias nas tabelas de nós tornam muito mais fácil fornecer o valor $node_id à instrução INSERT.

se você agora consultar a tabela de Postagens, seus resultados devem ser semelhantes aos mostrados na figura a seguir.

a tabela deve conter o novo relacionamento, com o ImportantFlag definido como 0, o padrão. Agora você pode adicionar mais algumas linhas, usando as seguintes instruções de inserção:

1
2
3
4
5
6
7
8
9
10
11
12

INSERIR EM Postos ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 3),
(SELECCIONE $node_id DE FishPost ONDE PostID = 2));
INSERT INTO Posts ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 2),
(SELECCIONE $node_id DE FishPost ONDE PostID = 5));
INSERIR EM Postos ($from_id, $to_id, ImportantFlag) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 5),
(SELECCIONE $node_id DE FishPost ONDE PostID = 4), 1);
INSERT INTO Posts ($from_id, $to_id, ImportantFlag) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 4),
(SELECCIONE $node_id DE FishPost ONDE PostID = 1), 1);

Observe que as duas últimas instruções INSERT, também, fornecer um valor para o ImportantFlag coluna. Ao consultar a tabela de Postagens, seus resultados agora devem incluir todas as cinco linhas.

o próximo passo é criar e preencher a tabela de curtidas, usando o seguinte código T-SQL:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE IF EXISTS Gosta;
IR p
CRIAR TABELA Gosta de COMO BORDA;
INSERT INTO Gosta ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 3),
(SELECCIONE $node_id DE FishSpecies ONDE FishID = 8));
INSERT INTO Gosta ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 5),
(SELECCIONE $node_id DE FishPost ONDE PostID = 4));
INSERT INTO Gosta ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishLover ONDE FishLoverID = 1),
(SELECCIONE $node_id DE FishLover ONDE FishLoverID = 4));

Você pode, é claro, definir quaisquer relacionamentos que você deseja. O ponto importante a notar aqui é que você não está limitado a nenhum conjunto de nós. Por exemplo, a primeira instrução INSERT, cria uma relação entre FishLover e FishSpecies, a segunda instrução cria uma relação entre FishLover e FishPost, e a terceira instrução cria uma relação entre FishLover e FishLover. Isso nos dá os resultados da consulta mostrados na figura a seguir.

você pode adotar a mesma abordagem ao criar e preencher a tabela LinksTo:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE IF EXISTS LinksTo;
IR p
CRIAR TABELA LinksTo COMO BORDA;
INSERT INTO LinksTo ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishPost ONDE PostID = 2),
(SELECCIONE $node_id DE FishSpecies ONDE FishID = 6));
INSERT INTO LinksTo ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishPost ONDE PostID = 4),
(SELECCIONE $node_id DE FishLover ONDE FishLoverID = 1));
INSERIR EM LinksTo ($from_id, $to_id) VALORES (
(SELECIONAR $node_id DE FishPost ONDE PostID = 3),
(SELECCIONE $node_id DE FishPost ONDE PostID = 5));

a figura A seguir mostra os dados devem ser apresentados depois de ser adicionado à tabela, supondo que você seguiu o exemplo.

com um banco de dados gráfico, você pode adicionar uma ampla gama de relações entre nós de origem e terminação. Você também pode facilmente incorporar alterações ao modelo gráfico. Por exemplo, você pode decidir adicionar uma tabela de nó FishRecipes para armazenar as receitas de peixe que os usuários postam no fórum, caso em que você pode aproveitar as postagens existentes, curtidas e tabelas de borda LinksTo.

avançar com bancos de dados Graph

como a Microsoft inclui os recursos do banco de dados graph como parte do mecanismo de banco de dados do SQL Server, você pode experimentá-los facilmente sem precisar instalar ou reconfigurar nenhum componente. O melhor de tudo é que você pode usar as mesmas ferramentas e procedimentos que usa o tempo todo para criar e preencher tabelas de nó e borda. Nos artigos a seguir, abordaremos como consultar e modificar dados gráficos e dar uma olhada mais de perto no trabalho com dados hierárquicos, portanto, fique atento.

Deixe uma resposta

O seu endereço de email não será publicado.