Exemplo de otimização de armazenamento de dados
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
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.
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.
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...
É 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.
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.
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)
Saiba onde surgiu o MySQL e por que ele é um dos bancos de dados mais utilizados por diversas empresas para desenvolvimento de seus projetos
PROGRAMAÇÃO EM DELPHI, O MAIS FAMOSO COMPILADOR E MODELADOR DE OBJETOS DA ATUALIDADE
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.
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".
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
Esse tutorial ensina como transformar seu iPhone ou iPod em pendrive para guardar arquivos e realizar backup's de seu notebook ou pc.
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.
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.
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!!
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.
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.
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.
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.
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.
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].
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.
Em minhas recentes atividades como arquiteto de soluções .net, deparei em alguns clientes com uma situação no mínimo inusitada...
