Exemplo de otimização de armazenamento de dados

Publicado em: 14/02/2008 | Comentário: 0 | Acessos: 1,197

Olá Pessoal! Esse artigo tem como objetivo propor a solução de um problema no qual deparamos com razoável freqüência, e se você ainda não o teve pela frente, provavelmente ainda o terá especialmente se você desenvolve aplicações comerciais.

Meu grande objetivo com esse artigo, bem mais que propor uma solução, é despertar nos leitores o prazer obtido durante o processo a racionalização e solução otimizada de mais um, dos vários problemas que deparamos em nosso dia a dia.

O Problema

Imaginemos o cenário onde precisamos gerenciar eventos, por exemplo, no desenvolvimento de uma agenda. Uma das características de um evento é sua periodicidade, que pode ser, única, diária, semanal e mensal. Suponhamos que na periodicidade semanal, além de informar a quantidade de semanas de ocorrência do evento, seja necessário especificar os dias da semana que o evento ocorrerá, por exemplo:

. As aulas do curso de C# ocorrerão a partir do dia 30/10/2006, nas próximas 4 semanas às segundas, quartas e sextas-feiras.
. As reuniões de acompanhamento do projeto, ocorrerão a partir do dia 01/11/2006, pelos próximos 4 meses.
. A apresentação do projeto será realizada dia 20/12/2007.

Proposta de modelo de dados

Uma modelagem de dados muito utilizada seria algo semelhante ao apresentado abaixo, ou algo muito próximo disso, com uma tabela somente com os dias da semana relacionada à tabela de eventos.



                    EVENTO_TIPO_FREQUENCIA
          Char


                    EVENTO_TOTAL_DIAS
          Int


                    EVENTO_TOTAL_SEMANAS
          Int


                    EVENTO_TOTAL_MESES
          Int


                    EVENTO_DIA_SEGUNDA
          Bit


                    EVENTO_DIA_TERCA
          Bit


                    EVENTO_DIA_QUARTA
          Bit


                    EVENTO_DIA_QUAINTA
          Bit


                    EVENTO_DIA_SEXTA
          Bit


                    EVENTO_DIA_SABADO
          Bit


                    EVENTO_DIA_DOMINGO
          Bit



Tabela 1- modelo parcial da tabela de eventos
Onde, o atributo TIPO_FREQUENCIA é definido em um domínio pré-estabelecido, por exemplo [1-único, 2 – diário, 3 – semanal, 4 - mensal].

Os atributos TOTAL_DIAS, TOTAL_SEMANAS, TOTAL_MESES, contabilizam o período de ocorrência do evento para cada tipo da freqüência.

E finalmente os atributos DIA_XXX, especificam os dias da semana de ocorrência do evento.

Deficiências

O processo de manutenção dessas informações será deveras penoso sob os seguintes aspectos:

. Temos uma quantidade razoável de atributos, onde sempre haverá desperdício de espaço em nosso repositório de dados.
. A codificação terá que contemplar todos esses atributos [procedures com muitos parâmetros, classes com todas essas propriedades, métodos de validação e operações de CRUD com vários parâmetros].
. Processo de alteração mais complexo – um evento inicialmente cadastrado como semanal, 4 vezes, às tercas, quintas e sábados ao ser modificado para mensal, 2 vezes, serão necessários instruções adiocionais para atualizar todos os atributos.

Sugestão

Nossa solução propõe uma redução drástica na quantidade de atributos na tabela de eventos.



                    EVENTO_TIPO_FREQUENCIA
          Char


                    EVENTO_QUANTIDADE_FREQUENCIA
          Int


                    EVENTO_DIAS_DA_SEMANA
          Byte



Tabela 2- modelo parcial da tabela de eventos - solução proposta
O atributo TIPO_FREQUENCIA mantém a mesma definição da solução anterior.

Aqui, o atributo QUANTIDADE_FREQUENCIA armazena o total de ocorrência do evento, seu sentido será dado em função do TIPO_FREQUENCIA.

E, finalmente, a grande otimização do cenário, em um único atributo - DIAS_DA_SEMANA , do tipo byte, armazenaremos os dias da semana e todas as suas combinações, caso, claro, tenhamos uma freqüência do tipo semanal. Obviamente ainda poderemos ter “desperdício” de um atributo, mas somente para o tipo da freqüência diferente de semanal.

Mas como armazenar tantas informações em um único atributo, e do tipo byte?

Recordar é viver – os tipos de dados fundamentais são formados por conjuntos de bits – assim, um inteiro possui 4 bytes x 8 bits = 32 bits, um double possui 8 bytes x 8 bits = 64 bits, etc. No nosso caso, onde temos que manipular 7 informações (os dias da semana), a melhor opção é um campo do tipo byte que tem 8 bits, tudo bem, ainda desperdiçamos 1, mas nem tudo é perfeito.

Decodificando um campo byte temos:



                    0000 0001
          01


                    0000 0010
          02


                    0000 0100
          04


                    0000 1000
          08


                    0001 0000
          16


                    0010 0000
          32


                    0100 0000
          64



Tabela 3- um byte em bit
Atribuindo um dia da semana para cada valor:



                    0000 0001
01
          domingo


                    0000 0010
02
          segunda-feira


                    0000 0100
04
          terça-feira


                    0000 1000
08
          quarta-feira


                    0001 0000
16
          quinta-feira


                    0010 0000
32
          sexta-feira


                    0100 0000
64
          sábado



Tabela 4 - dias e valores correspondentes
Matematizando os dias da semana:



                    0000 0001
01 ↔ 2 0
          domingo


                    0000 0010
02 ↔ 2 1
          segunda-feira


                    0000 0100
04 ↔ 2 2
          terça-feira


                    0000 1000
08 ↔ 2 3
          quarta-feira


                    0001 0000
16 ↔ 2 4
          quinta-feira


                    0010 0000
32 ↔ 2 5
          sexta-feira


                    0100 0000
64 ↔ 2 6
          sábado



Tabela 5 - dias e valores correspondentes

Ora, concluímos que o valor associado à um dia da semana corresponde ao número 2 elevado ao seu “peso”, 2 (dia da semana). E para combinação de vários dias como nos exemplos acima? Simples, é só “ligar” os bits correspondentes à cada dia, vejamos:   + Segunda, Quarta e Sexta == 0010 1010 == 2 1 + 2 3 + 2 5 == 02 + 08 + 32 == 42   + Terça, Quinta e Sábado == 0101 0100 == 22 + 24 + 26 == 04 + 16 + 64 == 84.

Logo, ao invés de manipular diversos atributos, propriedades e parâmetros na codificação, calculamos um único valor numérico que representa a combinação de todos os dias da semana e assim manipulamos somente um atributo, simplificando e otimizando nosso trabalho.

Finalmente, a expressão para obtenção desse valor será : Valor += 2 (dia da semana) , onde o dia da semana será obtido de sua interface.

E o processo inverso?

Como recuperar o valor armazenado no repositório de dados e disponibilizá-lo ao usuário? Ora, precisamos desse valor representado em bits novamente, ou melhor, em um conjunto de bits (7), em seu devido estado fundamental – ligado x desligado, mais precisamente devido interação com a interface true x false. Mais uma vez recorremos à maravilhosa matemática. Nosso algoritmo foi baseado em funções exponenciais, onde uma das formas de análise dessas funções é o processo conhecido como fatoração, lembram?



          64
          2


          32
          2


          16
          2


          08
          2


          04
          2


          02
          2


          01
         



Tabela 6 - fatoração de 64 na base 2, 64 = 26
Pois bem, precisamos de um conjunto, ou array de bits ligados e desligados, correspondente ao valor armazenado, combinando as operações de fatoração e resto das divisões sucessivas teremos exatamente as informações que precisamos:



       42 = ?


       O resto da divisão 42 / 2 = 0    (fatorando = 21)


       O resto da divisão 21 / 2 = 1    (fatorando = 10)


       O resto da divisão 10 / 2 = 0    (fatorando = 05)


       O resto da divisão 05 / 2 = 1    (fatorando = 02)


       O resto da divisão 02 / 2 = 0    (fatorando = 01)


       O resto da divisão 01 1             (fim)



Tabela 7 - Combinando, fatoração e resto das divisões
Esses “zeros” e “uns” gerados, tomados de baixo para cima , corresponde exatamente ao nosso conjunto inicial de bits (10 1010), complementando-os com zeros à esquerda, bingo: 0010 1010, ou melhor, um array do tipo [false – false – true – false true – false – true –false].

Conclusão

É isso ai pessoal, espero ter atingido meu objetivo, despertando nos caros colegas a sensação de que nosso trabalho deve ir muito além de pesquisar no google códigos para resolução de problemas.

Precisamos sim, analisar as situações, racionalizar os problemas (sem esquecer a intuição) e propor soluções da melhor forma possível. Como vimos, especialmente depois de pronto, a codificação utilizada foi mínima, e é ai que está o grande mérito da proposta, conseguimos muito com bem pouco, em mais uma demonstração da lei natural do mínimo esforço (não à toa, a matemática foi nossa principal ferramenta).

Se vocês concluíram que pequenas idéias (geralmente fruto da imaginação) podem fazer grande diferença em nossas carreiras, já estarei satisfeito, afinal como dizia o grande Albert Einstein, “A imaginação é mais importante que o conhecimento”.

(Artigonal SC #333191)

Avalie este artigo
  • 1
  • 2
  • 3
  • 4
  • 5
  • 0 Voto(s)
    Feedback
    RSS
    Imprimir
    Email
    Re-Publicar

    Fonte do artigo: http://www.artigonal.com/informatica-artigos/exemplo-de-otimizacao-de-armazenamento-de-dados-333191.html

    Palavras-chave do artigo:

    programação

    ,

    banco de dados

    ,

    bancos de dados

    Sergio Lopes de Souza Junior

    Como um dos componentes mais antigos associados a computadores, o sistema de gerenciamento de banco de dados, ou SGBD, é um software que foi concebido como objetivo de gerenciar todos os bancos de dados. Existem diferentes tipos de sistemas de gerenciamento de banco de dados, sendo que alguns deles concebidos para a supervisão e controle adequado das bases de dados configurados para fins específicos.

    Por: Sergio Lopes de Souza Junior l Informática l 26/11/2009 l Acessos: 194

    Se você está iniciando o aprendizado ou migrando para a plataforma .NET, pode estar confuso quando o assunto é acesso a dados. Motivos não faltam, afinal você tem a sua disposição diversas opções na plataforma .NET para realizar acesso a dados com classes e métodos distintos: DataSets, DataReaders, XML, TableAdapters, DataAdapter, Command, etc.

    Por: José Carlos Macoratti l Informática > Programação l 17/02/2008 l Acessos: 2,011 l Comentário: 1
    Alexandre Portela Barbosa.Msc

    É um sistema criado pelo Conselho Monetário Nacional e gerido pelo Banco Central que, obedecidas a determinadas condições, permite a troca de informações sobre operações de crédito entre os integrantes do Sistema Financeiro Nacional Banco Central do Brasil, bancos múltiplos, comerciais, caixas econômicas, bancos de investimento, bancos de desenvolvimento, sociedades de crédito imobiliário, sociedades de crédito, financiamento e investimento, companhias hipotecárias, agências de fomento ou de desenvolvimento, sociedades de arrendamento mercantil, cooperativas de crédito e sociedades de crédito ao micro empreendedor.

    Por: Alexandre Portela Barbosa.Msc l Finanças l 28/11/2008 l Acessos: 3,310
    Felipe Ferreira

    Saiba onde surgiu o MySQL e por que ele é um dos bancos de dados mais utilizados por diversas empresas para desenvolvimento de seus projetos

    Por: Felipe Ferreira l Internet > Hospedagem l 27/01/2010 l Acessos: 125

    PROGRAMAÇÃO EM DELPHI, O MAIS FAMOSO COMPILADOR E MODELADOR DE OBJETOS DA ATUALIDADE

    Por: marcos alexandre l Informática > Programação l 16/02/2010 l Acessos: 62

    Neste momento, temos turmas abertas para os cursos de Linguagem C++, Visual C++.NET, C++ para Linux e Qt - Desenvolvimento multi-plataformas com diversas opções de pagamento e descontos. Aprendendo estes cursos você estará apto a programar com facilidade e qualidade além de se capacitar para o mercado de trabalho exigente.

    Por: Basilio Miranda l Press Release l 25/06/2009 l Acessos: 378
    Sandra Regina da Luz Inácio

    Com o expansão da internet nos últimos dez anos , justamente durante o período da internacionalização do país, houve a necessidade de nos adaptarmos a essa nova tecnologia que muito contribui no comércio internacional , principalmente para a pequena empresa.

    Por: Sandra Regina da Luz Inácio l Negócios & Admin. > Administração l 16/11/2008 l Acessos: 791

    Estamos no século 21 e a nossa tecnologia está sofrendo uma evolução constante. No mundo da informática tudo muda de uma maneira tão rápida que, por vezes, nem permite que agente se especifique em algo. Temos de estar sempre atualizados com as notícias que rolam por todo o mundo e sempre de olho nos lançamentos e nas novidades. O computador é uma maquina que nos ajuda a acessar todas essas informações .

    Por: Breno Aguiar l Informática l 17/03/2010 l Acessos: 4
    Felipe Ferreira

    Depois de grande sucesso na tv e nas bancas, Naruto agora invade o mundo da internet como uma infinidade de jogos online do Naruto disponíveis na rede.

    Por: Felipe Ferreira l Informática l 11/03/2010 l Acessos: 11

    Nos dias de hoje, as pessoas querem cada vez mais o poder. E para conseguir o poder precisa-se de dinheiro! Muitos preferem estudar, fazer uma Pós, um Mestrado, Doutorado, trabalhar no seu ramo, crescer e consequentemente ganhar muito dinheiro. Outros procuram outras maneiras, alguns por preguiça, outros por não terem condições e acabam apostando na sorte.

    Por: Breno Aguiar l Informática l 09/03/2010 l Acessos: 14
    Gabriel Monteiro

    "Maneira Fácil de Saber o que fizeram em seu computador enquanto esteve fora sem esforço. Relatórios via email"

    Por: Gabriel Monteiro l Informática l 09/03/2010 l Acessos: 61
    Gabriel Monteiro

    Quem nunca se deparou em ultima hora com um arquivo em word que devia ser convertido a PDF e você não consegue encontrar um software bom e barato. Neste artigo irei lhe mostrar aonde encontrar...

    Por: Gabriel Monteiro l Informática l 09/03/2010 l Acessos: 10

    Uma visão geral a respeito da relação entre a informática/tecnologia e a Contabilidade, apresentando meus pontos de vista e opiniões a respeito deste assunto.

    Por: Mayender Alves de Souza l Informática l 03/03/2010 l Acessos: 56

    A engenharia de software vem aprimorando técnicas em busca de produtividade e facilidade, no desenvolvimento e manutenção dos softwares. Nesse contexto, fatores como padronização e documentação, têm um papel muito importante, pois influenciam diretamente na prevenção e eliminação de defeitos de software. Este trabalho busca identificar na prática, quais são os artefatos mais utilizados nessas atividades para poder obter uma maior qualidade no processo de desenvolvimento e manutenção de software

    Por: Fábio Cristofalo da Silva l Informática l 08/02/2010 l Acessos: 81
    Notebook Reparos

    Uma solução muito atraente para aqueles que desejam manter o sistema operacional Vista ou 7 (Seven) original de fábrica, sem perder também as funcionalidades como botões de atalhos e afins, um problema muito comum nos notebooks da marca Sony.

    Por: Notebook Reparos l Informática l 08/02/2010 l Acessos: 107
    Caio Azevedo

    Estamos a beira de uma revolução, a plataforma .Net é um fato, boa parte dos desenvolvedores seguirá esse caminho. Enquanto isso na “vida real” nos deparamos todo dia com a boa e velha formula: ASP, VB 6.0/COM+, JavaScript, SQL Server. E é nesse ambiente que tenho dedicado meu tempo nos últimos seis meses, e o que pretendo nesse espaço é compartilhar o que aprendemos nesse período.

    Por: Caio Azevedo l Informática > Programação l 14/02/2008 l Acessos: 551
    Caio Azevedo

    Partiremos dos fundamentos teóricos da tecnologia, e através de exemplos tentaremos prover soluções para as situações do nosso dia a dia. Seria interessante contar com a interatividade de vocês leitores com críticas e sugestões sobre os assuntos abordados.

    Por: Caio Azevedo l Informática > Programação l 14/02/2008 l Acessos: 3,341 l Comentário: 1
    Caio Azevedo

    Minha proposta nesse espaço inicialmente seria de analisarmos a linguagem C#, sua sintaxe, implementações dos conceitos de orientação a objetos, etc. Para tal ,acredito que a implementação de programas console [aqueles que rodam no DOS], seja a melhor alternativa nesse primeiro momento.

    Por: Caio Azevedo l Informática > Programação l 14/02/2008 l Acessos: 747
    Caio Azevedo

    O que a princípio aparenta ser mais um dos novos conceitos do .net, veremos que o mesmo tem muito a ser explorado, e assim faremos, tentando extrair todo o potencial dessa funcionalidade do Framework, além de aproveitarmos a oportunidade para analisar a diretiva using[Imports, seu correspondente no VB.NET].

    Por: Caio Azevedo l Informática > Programação l 14/02/2008 l Acessos: 2,159 l Comentário: 1
    Caio Azevedo

    A Linguagem C# é totalmente baseada no modelo de programação orientada à objetos, sendo assim, profundos conhecimentos em alguns de seus elementos principais são de fundamental importância para que possamos extrair o máximo do modelo/linguagem, sobretudo aqueles desenvolvedores acostumados com outros modelos tais quais, programação estruturada e orientada à eventos.

    Por: Caio Azevedo l Informática > Programação l 14/02/2008 l Acessos: 613 l Comentário: 1
    Caio Azevedo

    Em minhas recentes atividades como arquiteto de soluções .net, deparei em alguns clientes com uma situação no mínimo inusitada...

    Por: Caio Azevedo l Informática > Programação l 14/02/2008 l Acessos: 1,611
    Caio Azevedo

    Esse artigo tem como objetivo propor a solução de um problema no qual deparamos com razoável freqüência, e se você ainda não o teve pela frente, provavelmente ainda o terá especialmente se você desenvolve aplicações comerciais.

    Por: Caio Azevedo l Informática l 14/02/2008 l Acessos: 1,197

    Adicionar novo comentário

     
    * Campos obrigatoriós
    Perfil do Autor
    Categorias de Artigos
    Todas as Categorias