Tipo de Dado Hierachy

 

Dando continuidade aos novos tipos de dados para o SQL Server 2008, vamos falar um pouco deste novo tipo que é bastante interessante e ao mesmo tempo mais um artifício que o desenvolver pode usar na definição e modelagem de seu banco de dados. Lembramos que já abordamos em um artigo anterior as mudanças para com os tipos de dados relacionados com Data e Hora para o SQL Server 2008.  




A idéia desse tipo de dado é que possa permite estabelecer relações entre atributos de uma tabela, especificamente para representar uma posição em uma hierarquia. Veja figura abaixo que representa graficamente a diferença do uso ou não desse novo tipo de dado. Não podemos esquecer que no SQL Server as linhas da tabela são fisicamente armazenadas de forma ordenada pelo índice, como árvores B internas. No decorrer deste artigo, você irá ter uma noção melhor disto.

sql-18-04-2008pic01.JPG

Para explorar esse tipo de dado, vamos demonstrar criando o banco de dados chamado DBHierachy e preenchendo-o com dados dos empregados por meio do script, veja Figura abaixo.

sql-18-04-2008pic02.JPG

A Figura a seguir mostra o banco de dados resultante em que consiste de uma única tabela. A tabela de empregados no banco de dados DBHierachy, não tem nenhuma estrutura imposta. Isso é normal para um banco de dados relacional, porque a estrutura é imposta dinamicamente por um aplicativo por meio da consulta e do código.

sql-18-04-2008pic03.JPG

Já os dados corporativos normalmente têm um tipo de estrutura inerente. Por exemplo, toda empresa tem uma estrutura hierárquica como, por exemplo, a criada para DBHierachy. Todos os funcionários da DBHierachy respondem ao Mateus, o presidente da companhia. Alguns deles respondem diretamente, como é o caso de João. Outros, a exemplo de Maria, respondem por meio de um intermediário. Em termos de programação, a estrutura hierárquica da DBHierachy é conhecida como árvore por conta da forma a que ela se assemelha. Mateus, no topo, não responde a ninguém; ele é o pai ou ancestral. Os funcionários que respondem ao João estão abaixo dele. Esses nós são conhecidos como filhos ou descendentes. João pode ter quantos descendentes forem necessários para representar seus subordinados diretos.

O script na Figura abaixo recria o banco de dados DBHierachy usando o tipo de dado hierarchyid, estabelecendo uma relação que corresponda à estrutura hierárquica da empresa. A instrução ALTER TABLE é usada para inicialmente adicionar uma coluna do tipo hierarchyid. Em seguida, o nó referente ao Mateus é inserido usando o método GetRoot de hierarchyid. Depois, os subordinados de Mateus são adicionados à árvore por meio do método GetDescendant.

sql-18-04-2008pic04.JPG

Assim que os registros do banco de dados forem adicionados e a hierarquia for construída, o conteúdo da tabela de empregados poderá ser exibido com uma consulta como esta:

sql-18-04-2008pic05.JPG

OrgNo é a coluna de hierarchyid. Cada caractere de barra / no resultado indica um nó na árvore hierárquica. Mateus está na raiz, indicada por uma única barra. Savia, Pedro e João respondem a Mateus e apresentam duas barras, o que indica serem o segundo nó da hierarquia. Os números 1, 2 ou 3 mostram a ordem do respectivo nó filho. O sistema é muito flexível. Os nós filhos podem ser removidos, inseridos ou adicionados conforme necessário. Se adicionássemos um empregado entre João e Pedro, por exemplo, ele seria listado no conjunto de resultados como: /2/1/. Para responder à pergunta, por exemplo, "Quem responde a Savia?", é possível criar uma consulta como mostramos no seguinte código T-SQL:

sql-18-04-2008pic06.JPG

A consulta usa o método GetAncestor de hierarchyid, que retorna o pai do nó de hierarchyid atual. No código anterior, a variável @Savia está definida como sendo o nó da hierarquia de Savia. Isso porque Savia é o ancestral direto de qualquer empregado que responda a ela. Por isso, escrever uma consulta que retorne os empregados que respondem diretamente a Savia consiste em recuperar o nó de Savia da árvore e selecionar todos eles, cujo ancestral seja o nó referente a Savia.

As colunas de hierarchyid tendem a ser muito compactas porque o número de bits necessários à representação de um nó em uma árvore depende do número médio de filhos no nó (normalmente conhecido como fan-out do nó). Por exemplo, um novo nó em uma hierarquia organizacional de 100 mil empregados, com um fan-out médio de seis níveis, exigiria cerca de cinco bytes de armazenamento.

O tipo de dado hierarchyid fornece vários métodos que facilitam o trabalho com dados hierárquicos. Há informações detalhadas sobre todos os métodos disponíveis no Books Online do SQL Server.

Esperamos que este artigo possa ter ajudá-lo a conhecer mais um nova funcionalidade do SQL Server 2008.