Conheça também: Onmasters . Ofertas . Divulgue! . Vai.la . Geraboleto . Baixa.la . Assista.la . Joga.la
» Início » Desenvolvimento » Banco de dados e SQL » Modelagem de Dados: Hierarquias - Parte 1 -->
 
Avaliação: | Publicado em: 16/01/2007
Modelagem de Dados: Hierarquias - Parte 1


Superando as desvantagens do modelo adjacente

A possibilidade da distância entre um nó e seus nós folhas ser variável é o grande inconveniente do modelo adjacente. Isso impede que instruções SQL (padrão ANSI) possam ser realizadas e recuperem o valor desejado. Isso ocorre porque o padrão ANSI 92* não está preparado para lidar com questões que envolvam recursividade. Para que essa limitação seja superada alguns caminhos são possíveis. Será utilizado como exemplo o cálculo do total de lançamentos do centro de custo “TI”.

Repassar a recursividade para a aplicação

Como o número de chamadas à própria tabela (Centros de Custo) é variável, é possível deixar a cargo da aplicação a responsabilidade de realizar a quantidade necessária de chamadas até que o nó folha seja atingido. O fluxograma abaixo demonstra como isso pode ser realizado.

Utilizar um comportamento procedural no banco de dados

A maioria dos bancos de dados permite a escrita de blocos de comando com comportamento procedural (em complementação ao comportamento declarativo da SQL). É possível utilizar um bloco de comando para tratar a recursividade e retornar o valor final. O exemplo abaixo demonstra como fazer isso em Transact SQL (SQL Server 7/2000).

DECLARE
    @CentrosCustoColetados TABLE (
    IdCentroCusto INT, Processado BIT DEFAULT 0)

DECLARE
    @NomeCentroCusto VARCHAR(80),
    @IdCentroCusto INT

SET @NomeCentroCusto = 'TI'
SET @IdCentroCusto = (SELECT IdCentroCusto FROM CentrosCusto WHERE NomeCentroCusto = @NomeCentroCusto)

-- Insere o centro de custo "Pai" na lista de centros de custo calculados e processados
INSERT INTO @CentrosCustoColetados (IdCentroCusto) VALUES (@IdCentroCusto)

-- Enquanto não preencher todos os níveis
WHILE (SELECT COUNT(*) FROM @CentrosCustoColetados WHERE Processado = 0) > 0
BEGIN

    INSERT INTO @CentrosCustoColetados (IDCENTROCUSTO)
    SELECT IdCentroCusto FROM CentrosCusto WHERE IdCentroCustoSup = @IdCentroCusto
    UPDATE @CentrosCustoColetados SET Processado = 1 WHERE IdCentroCusto = @IdCentroCusto
    SET @IdCentroCusto = (SELECT TOP 1 IdCentroCusto FROM @CentrosCustoColetados WHERE Processado = 0)

END

SELECT
    SUM(ValorLancamento) AS Total
FROM
    Lancamentos
WHERE
    IdCentroCusto IN
    (SELECT IdCentroCusto FROM @CentrosCustoColetados)

* O padrão ANSI 92 é o implementado na maioria dos SGBDs convencionais. É possível que na elaboração de outros padrões (SQL 99 e SQL 2003) já estejam contempladas alternativas para trabalhar a recursividade.

Este artigo é a parte 1 de 4 da seguinte série:

Davi Albuquerque <davialbuquerque@msn.com>
Parabéns pelo Artigo, uma verdadeira aula. hehe
Poderia ser mas expecífico, não contém informações completas..
As informações contidas não são o suficiente.
Heraldo Aguiar <haguiar@terra.com.br>
Sou financeiro leigo no assunto e ultimamente tenho me interessado em aprender um pouco.
Cara, bem legal. Excelente didática, coisa de Aguiar. Parabéns