 |
Exemplo de otimização de armazenamento de dados
Por: Caio Azevedo  | Publicado em: 14-02-2008 | Comentários: 0 | Acessos: 359 | Avaliação: (144) (?)
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”.
Avalie este artigo:
Current: 0 / 5 stars - 0 vote(s).
Fonte Artigos - Artigonal.com
Perfil o autor:Caio Azevedo é arquiteto de softwares, especialista em soluções corporativas nos ambientes intranet/internet. Graduado em Ciência da Computação, Mestrando da Escola Politécnica da USP. Certificações Microsoft [MCP, MCAD e MCSD .NET]. Gestor da célula Microsoft da Magna Sistemas Consultoria (www.magnasistemas.com.br).
|
Submeter artigos se tornou um dos meios os mais populares de gerar links de qualidade e tráfego para o seu site. CADASTRE-SE JÁ, É DE GRAÇA! |
|
Artigos Relacionados
Tags – O Que São Por: Ruy Miranda | 05/02/2008 | Web Design Para que você possa entender o que são as tags, vamos começar explicando o significado da palavra. Tag em inglês (a maioria das palavras na linguagem do computador são originadas do inglês) significa etiqueta, rótulo. E etiqueta é algo que colocamos em objetos, mercadorias, arquivos, etc. para nos ajudar na lida diária, para nos orientar.
A Personalidade, o Comportamento Dos Marginalizados E Suas Conseqüências Por: Adriano Martins Pinheiro | 22/07/2008 | Desigualdades Sociais A personalidade é composta por vários fatores ao longo da vida.
Uma pessoa é atualmente fruto do que foi construído anteriormente, ou seja, como foi construída sua personalidade.
O meio social, a família, as influências do grupo social, a educação e as experiências, integram-se na formação do indivíduo e influenciam seu comportamento por toda sua vida.
Meta Tags – O Que São Por: Ruy Miranda | 05/02/2008 | Web Design Meta é um prefixo que entra na composição de muitas palavras, como por exemplo, metabolismo, metabólito. (Não confundir com o substantivo meta, popular entre nós, e que, entre outras coisas, significa aquele espaço que fica entre três páus ou hastes, e onde os jogadores de futebol fazem os gols.) Quando se fala em "meta tags" o prefixo fica separado do substantivo tag.
Algumas Coisas Que Aprendi Para Obter Sucesso Por: Adriano Martins Pinheiro | 03/08/2008 | Carreira Tenha metas claras e objetivos bem definidos.
Não se perca em muitos pensamentos, sonhos e fantasias, a vida não é uma novela, não é um filme de Hollywood. Nada será tão fácil e tão espetacular como assistimos. A vida nos oferece dificuldades e imprevistos, temos que estar firmes e com caminhos bem traçados.
Meta Tags: Importância para os Mecanismos de Busca Por: Ruy Miranda | 05/02/2008 | Web Design Pode-se dizer que as meta tags são importantes para todos os mecanismos de busca. Elas já tiveram importância maior em um passado recente. A ordenação dos sites, principalmente nos diretórios, dependia muito das meta tags.
Por Que Aprender C++ ? Por: Basilio Miranda | 29/10/2008 | Tecnologia C++ é uma linguagem de propósito geral que pode ser utilizada para qualquer finalidade e em múltiplas plataformas
C++ é uma linguagem flexível, multiparadigma, que permite que se utilize tanto programação orientada a objetos como programação genérica
C++ é a linguagem de programação mais completa que já foi criada, sendo também, uma linguagem altamente expressiva e lógica. E por isso muitas das linguagens que foram criadas depois (Java, por exemplo) são, de algum modo, inspiradas por C++.
Tag Título: Número de Caracteres e a Posição da Marca da Empresa Por: Ruy Miranda | 05/02/2008 | Web Design A tag título deve ter um número limitado de caracteres. Existem pequenas diferenças entre Google e MSN de um lado, e Yahoo de outro, em relação ao número limite. A posição da marca da empresa pode ser relevante no posicionamento das palavras que preencherão o número de caracteres recomendados.
Desmistificando as Classes Por: Caio Azevedo | 14/02/2008 | Programação 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.
Últimos Informática artigos
Software Livre_Passado, Presente Futuro Por: Alexandre Silveira | 18/04/2008 Este artigo conta um pouco da história do software livre, resumindo desde sua criação até as suas expectativas para o futuro.
Estudando As Particularidades Da Ferramenta Microsoft Windows Sharepoint Services Como Soluções Corporativas Por: Vanessa G. Moreira | 14/04/2008 Este trabalho é de grande importância para os alunos, professores e profissionais da área de informática que fazem bom uso da Tecnologia da Informação, pois os mesmos poderão entender como funcionam as particularidades da ferramenta Microsoft Windows Sharepoint Services dentro de uma organização. O mesmo está em evidência, se expandindo a cada dia nas mais variadas empresas. Portanto, quem pretende utilizar esta ferramenta deverá conhecer bem sobre este sistema.
Windows 2008 - Server Core Por: Leonardo Moraes | 21/03/2008 Nova opção de instalação do Windows Server que visa gerar economia, redução de TCO e aumento de segurança.
Qual O Melhor Sistema Operacional? Por: Ruben Zevallos Jr. | 08/03/2008 Qual o melhor sapato? Qual a melhor roupa? Qual o melhor carro?
Conspiração Cibernética Por: Mathias Gonzalez | 03/03/2008 Seu micro já travou hoje? Não estressa não! Isso acontecerá com todos nós pobres mortais que confiamos nestas "drogas" de máquinas que parecem ter sido programadas para nos tirar o sossego ou no mínimo nos viciar nelas.
A organização eficiente do e-mail Por: Armando Terribili Filho | 15/02/2008 O objetivo deste artigo é apresentar algumas facilidades para você na gestão de sua caixa postal. Coisa simples, porém, útil.
Dificuldades na exportação de software: de quem é a culpa? Por: Armando Terribili Filho | 15/02/2008 O artigo mostra que as dificuldades de exportação de software transcendem as políticas de incentivo fiscal do governo brasileiro, tendo como co-responsáveis os empresários que não investem em qualificação e certificação de seus profissionais. No mercado internacional, as certificações (de empresas e de profissionais) são valorizadas e funcionam como um "cartão de visitas" para credenciamento das empresas para exportar software.
Consultas com JOINS Por: Thiago Caserta | 11/02/2008 Um breve conceito e exemplos práticos das poderosas cláusulas de amarrações entre tabelas, os famosos JOINs (LEFT JOIN, RIGHT JOIN, INNER JOIN e FULL JOIN).
Mais artigos de Caio Azevedo
Especial sobre .Net Por: Caio Azevedo | 14/02/2008 | Programação 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.
Fundamentos teóricos sobre C# Por: Caio Azevedo | 14/02/2008 | Programação 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.
MSIL - Microsoft Intermediate Language Por: Caio Azevedo | 14/02/2008 | Programação 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.
Usando Namespaces profissionalmente Por: Caio Azevedo | 14/02/2008 | Programação 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].
Desmistificando as Classes Por: Caio Azevedo | 14/02/2008 | Programação 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.
Problemas com modelos de aplicações web Por: Caio Azevedo | 14/02/2008 | Programação Em minhas recentes atividades como arquiteto de soluções .net, deparei em alguns clientes com uma situação no mínimo inusitada...
|
 |