Exemplo de otimização de armazenamento de dados

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

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”.

Perguntas e Respostas

Pergunte
200 Letras sobrando
Avaliar artigo
  • 1
  • 2
  • 3
  • 4
  • 5
  • 0 Voto(s)
    Feedback
    Imprimir
    Re-Publicar
    Fonte do artigo: http://www.artigonal.com/tecnologia-artigos/exemplo-de-otimizacao-de-armazenamento-de-dados-333191.html

    Palavras-chave do artigo:

    banco de dados

    ,

    programacao

    ,

    bancos de dados

    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 Macorattil Tecnologia> Programaçãol 17/02/2008 lAcessos: 2,619 lComentário: 1
    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 Juniorl Tecnologia> TIl 26/11/2009 lAcessos: 793

    Igualmente a muitas tecnologias na computação industrial, os fundamentos de bancos de dados relacionais surgiram na empresa IBM, nas décadas de 1960 e 1970, através de pesquisas de funções de automação de escritório. Foi durante um período da história na qual empresas descobriram que estava muito custoso empregar um número grande de pessoas para fazer trabalhos como armazenar e indexar (organizar) arquivos. Por este motivo...

    Por: Bruno E. Rosal Tecnologia> Programaçãol 02/12/2010 lAcessos: 164
    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.Mscl Finançasl 28/11/2008 lAcessos: 9,188
    Tito de Barros Junior

    Em desenvolvimento de sistemas por uma questão ou outra, às vezes faz-se necessário buscar outros meios de obter uma solução e há quem diga o contrário, mas uma questão pouco trivial é utilizar outras "fontes de dados" que não um banco de dados tradicional. Quem é da área percebe que muitas empresas antes de adotarem um sistema informatizado, controlam seus dados financeiros através de planilhas do Excel e é para desenvolvedores que enfrentam esse tipo de barreira que este artigo foi escrito.

    Por: Tito de Barros Juniorl Tecnologia> TIl 13/02/2011 lAcessos: 1,209 lComentário: 2
    Pedro Miguel Garrido Mesquita

    Olá a todos ! Este artigo ajuda a compreender um pouco acerca da linguagem SQL e como pode ser usada para consultar e modificar bases de dados. É uma das linguagens mais usadas actualmente em todo o mundo, no mercado informático das bases de dados. Bem vindos! Os meus cumprimentos, Pedro Mesquita (http://pedromesquita.pt.to)

    Por: Pedro Miguel Garrido Mesquital Tecnologia> Programaçãol 20/02/2011 lAcessos: 291
    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 Ferreiral Internet> Hospedageml 27/01/2010 lAcessos: 2,535 lComentário: 3

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

    Por: marcos alexandrel Tecnologia> Programaçãol 16/02/2010 lAcessos: 565

    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 Mirandal Press Releasel 25/06/2009 lAcessos: 556
    Temusados - Notícias de Carros

    A Audi apresentou no dia 16 (quarta-feira), em Caríntia, na Áustria, uma máquina esportiva extremamente emocional: a e-bike Worthersee. O protótipo combina um propulsor elétrico com a força muscular humana. Wolfgang Egger, chefe de design da AUDI AG, comenta: "Como uma e-bike de alto desempenho para o esporte e para acrobacias, a bicicleta combina as competências chave da Audi: design, as tecnologias ultra, e-tron e connect".

    Por: Temusados - Notícias de Carrosl Tecnologial 18/05/2012
    Gustavo Rocha

    Hoje, 14 de Maio, comemoramos no Brasil o dia da Internet. Nesta data, uma pergunta é fundamental: O que você faria sem a internet? Muitos dirão que é um sonho viver sem internet, que viveriam em paz, maior tranquilidade, etc. Para outros seria quase um suicídio, pois vivem diretamente conectados. Agora, a análise dentro da ótica da gestão e tecnologia passa por duas análises importantes: No que a gestão do meu negócio precisa e utiliza a internet e no que a tecnologia dele está dependente ou

    Por: Gustavo Rochal Tecnologial 14/05/2012
    Rick Braga

    Esse tutorial ensina como transformar seu iPhone ou iPod em pendrive para guardar arquivos e realizar backup's de seu notebook ou pc.

    Por: Rick Bragal Tecnologial 25/04/2012 lAcessos: 26

    O Galaxy SII é sinônimo de sucesso, agradou o público e se tornou o preferido de muita gente, ajudando a Samsung a bater recorde nos lucros. Sua nova versão será lançada em breve. No dia 03 de maio, em Londres, na Inglaterra, vai acontecer o lançamento do Galaxy SIII.

    Por: celulardiretol Tecnologial 20/04/2012 lAcessos: 26

    O novo iPad foi lançado no final de março, em San Francisco (EUA) e mais nove países. Mal foi lançado e já ultrapassou as vendas do iPad 2. A Anatel liberou a comercialização do produto e a Apple Brasil prevê lançamento em maio.

    Por: celulardiretol Tecnologial 18/04/2012 lAcessos: 11

    Conheça mais sobre os sistemas de separação de pedidos através do Pick by light e outras abordagens mais recentes de separação!!

    Por: Filipe Calerol Tecnologial 18/04/2012 lAcessos: 29

    Além de ser a maior operadora do Brasil, a Vivo é conhecida por antecipar as novidades do mercado. A união entre as telefonias fixa, móvel e TV a cabo é uma inclinação fortíssima do mercado e a Vivo já faz parte dela.

    Por: celulardiretol Tecnologial 17/04/2012

    Você vive conectado? Com celulares Wi-Fi, tablets e etc, é impossível encontrar quem não passe no mínimo uma hora por dia conectado.

    Por: Jessical Tecnologial 11/04/2012
    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 Azevedol Tecnologia> Programaçãol 14/02/2008 lAcessos: 620
    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 Azevedol Tecnologia> Programaçãol 14/02/2008 lAcessos: 4,527 lComentá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 Azevedol Tecnologia> Programaçãol 14/02/2008 lAcessos: 939
    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 Azevedol Tecnologia> Programaçãol 14/02/2008 lAcessos: 3,518 lComentá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 Azevedol Tecnologia> Programaçãol 14/02/2008 lAcessos: 734 lComentá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 Azevedol Tecnologia> Programaçãol 14/02/2008 lAcessos: 2,116

    Comentar sobre o artigo

    Perfil do Autor
    Categorias de Artigos
    Todas as Categorias
    Quantcast