Caché – Entendendo a Estrutura Multidimensional

É verdade que o Caché, após o Multidimensional, já é Relacional e Orientado a Objetos - o tão discutido "Pós-relacional". Mas a estrutura interna de armazenamento para qualquer paradigma, continua sendo a multidimensional. Então, desenvolvedores "Relacionais" e "Orientados a Objetos" não precisam realmente preocupar-se com isso. Sempre é bom ao menos conhecer, um pouco mais a baixo nível, como o Caché trabalha.

Já citei no artigo anterior que o Caché é um banco de dados pós-relacional e de alta performance. E que armazena as informações em estruturas multidimensionais persistentes. E agora, como falarei da estrutura multidimensional, estarei tratando exatamente o conteúdo de uma global. Tudo que você vê dentro de uma global faz parte da estrutura multidimensional, que nada mais faz além de hierarquizar os dados de uma melhor forma (se bem utilizado, é claro!).

Abaixo, o exemplo de uma global onde temos o cadastro de empresas, notas fiscais e itens das notas fiscais. Tudo isso sento armazenado em uma única global.

^empresa(1)="InterSystems do Brasil^Praça Professor José Lannes, 40^(11) 5500.1122"
^empresa(1,1)="8522^Centro Tecnológico Ensemble^Aguardando"
^empresa(1,1,1)="1^Licença Caché 5.2 Enterprise para 40 usuários^R$ 9.999,99"
^empresa(1,1,2)="2^Licença Caché 5.2 Entrée para 10 usuários^R$ 2.222,22"
^empresa(1,2)="8523^CacheTec^Faturada"
^empresa(1,2,1)="1^Licença Caché 5.0 Elite para 15 usuários^R$ 4.444,44"
^empresa(1,2,2)="1^Licença Caché 5.2 Enterprise para 20 usuários^R$ 6.666,00"

Analisando a global acima, temos um exemplo bem prático e didático - levando em consideração os dados inseridos (totalmente simbólicos). Pois bem, temos uma estrutura com três dimensões que poderiam estender-se em mais dimensões. Analisamos a estrutura multidimensional de acordo com os seus ÍNDICES (valores que ficam entre parênteses). O que está depois do sinal de igual, chamamos de VALOR.

Voltando à global, temos no primeiro nível o nome e dados da empresa. Neste caso, foi utilizado o delimitador "^" - bastante utilizado por usuários do Caché. Sendo assim, temos o nome da empresa, endereço da empresa e telefone da empresa. No segundo nível, temos cadastradas duas notas fiscais para esta empresa (1,1 e 1,2). Sabemos que essas notas fiscais são da empresa 1 porque a composição do índice da nota fiscal é: ID da empresa, ID da nota fiscal. E ainda num terceiro nível, temos os itens das notas fiscais que possuem seus índices compostos por: ID da empresa, ID da nota fiscal, ID do item da nota fiscal.

Sendo assim concluímos que a estrutura multidimensional hierarquiza as informações, armazenando de forma inteligente as informações que são co-relacionadas. Importante lembrar que o Caché não “sai gravando" as informações conforme vão sendo inseridas. Elas sempre estarão unidas, independente de quando forem inseridas. Se hoje eu quisesse incluir mais um item na nota fiscal "8522":

^empresa(1,1)="8522^Centro Tecnológico Ensemble^Aguardando"

Meu novo item seria armazenado logo a abaixo da linha:

^empresa(1,1,2)="2^Licença Caché 5.2 Entrée para 10 usuários^R$ 2.222,22"

Muitas vezes, quando acessado de forma relacional, por exemplo, são disparados comandos SQL que efetuam joins entre tabelas. Se o armazenamento estiver utilizando a estrutura multidimensional dentro de uma mesma global, o join será implícito, ganhando-se muita performance (Por exemplo, uma consulta fazendo um join entre as tabelas EMPRESA e NOTAFISCAL).

Outro aspecto importante para citar é que se trabalhando com orientação a objetos, geralmente não chegamos a arquitetar a forma de armazenamento a tão baixo nível. Mas, em alguns casos, o Caché automaticamente detecta essa necessidade e "monta" a estrutura de armazenamento de forma hierárquica, ganhando performance.

Abraço e até o próximo!