veja o trabalho

Propaganda
UNIVERSIDADE FEDERAL DE SANTA CATARINA
CENTRO TECNOLÓGICO
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE SISTEMAS DE INFORMAÇÃO
Uma Ferramenta de Apoio à Normalização de Tabelas Baseada na Análise dos
Dados
Aluno: Michel Leite de Ávila
Orientador: Ronaldo Santos Mello
Florianópolis, SC
Junho de 2007
SUMÁRIO
LISTA DE TABELAS ........................................................................................................................................... 4
LISTA DE FIGURAS ........................................................................................................................................... 5
LISTA DE COMANDOS SQL ............................................................................................................................. 6
LISTA DE REDUÇÕES ....................................................................................................................................... 7
1
2
INTRODUÇÃO ............................................................................................................................................ 8
1.1
VISÃO GERAL ....................................................................................................................................... 8
1.2
OBJETIVOS .......................................................................................................................................... 10
1.2.1
Geral .............................................................................................................................................. 10
1.2.2
Específicos ..................................................................................................................................... 10
1.3
JUSTIFICATIVA .................................................................................................................................... 11
1.4
METODOLOGIA.................................................................................................................................... 11
1.5
ESTRUTURA DO TRABALHO................................................................................................................. 12
FUNDAMENTAÇÃO TEÓRICA ............................................................................................................ 14
2.1
ENGENHARIA REVERSA ....................................................................................................................... 14
2.1.1
Visão Geral .................................................................................................................................... 14
2.1.2
Engenharia Reversa de Arquivos .................................................................................................. 14
2.2
DEPENDÊNCIA FUNCIONAL ................................................................................................................. 16
2.2.1
Visão Geral .................................................................................................................................... 16
2.2.2
Chave Única e Primária ................................................................................................................ 17
2.2.3
Dependência Funcional Total ....................................................................................................... 19
2.2.4
Dependência Funcional Parcial .................................................................................................... 19
2.2.5
Dependência Funcional Transitiva ou Indireta ............................................................................. 20
2.2.6
Dependência Funcional Multivalorada ......................................................................................... 21
2.2.7
Dependência Funcional de Sub-Domínio ...................................................................................... 21
2.2.8
Anomalias de Alteração................................................................................................................. 22
2.3
O PROCESSO DE NORMALIZAÇÃO ....................................................................................................... 23
2
3
TRABALHOS RELACIONADOS ........................................................................................................... 29
3.1
A INDEPENDÊNCIA FUNCIONAL NA NORMALIZAÇÃO DE BANCOS DE DADOS RELACIONAIS ............... 29
3.2
ENGENHARIA REVERSA DE BANCOS DE DADOS RELACIONAIS: ALGORITMOS PARA EXTRAIR
RESTRIÇÕES DE CARDINALIDADE ...................................................................................................................... 31
4
5
3.3
EXTRAINDO O DIAGRAMA ER DE BANCOS DE DADOS LEGADOS ........................................................ 32
3.4
CONSIDERAÇÕES FINAIS ..................................................................................................................... 34
A FERRAMENTA ..................................................................................................................................... 35
4.1
FUNCIONAMENTO GERAL .................................................................................................................... 35
4.2
TECNOLOGIAS UTILIZADAS ................................................................................................................. 36
4.3
MÓDULOS ........................................................................................................................................... 37
4.3.1
Módulo de Importação .................................................................................................................. 37
4.3.2
Módulo de Pré-Processamento...................................................................................................... 40
4.3.3
Módulo de Eleição de Chave Primária ......................................................................................... 43
4.3.4
Módulo da 1FN.............................................................................................................................. 45
4.3.5
Módulo da 2FN.............................................................................................................................. 48
4.3.6
Módulo da 3FN.............................................................................................................................. 54
CONCLUSÃO ............................................................................................................................................ 57
3
LISTA DE TABELAS
TABELA 1: EXEMPLO DE DEPENDÊNCIA FUNCIONAL. ............................................................................................ 17
TABELA 2: EXEMPLO DE CHAVE PRIMÁRIA............................................................................................................ 18
TABELA 3: EXEMPLO DE DEPENDÊNCIA FUNCIONAL TOTAL. ................................................................................. 19
TABELA 4: EXEMPLO DE DEPENDÊNCIA FUNCIONAL PARCIAL. .............................................................................. 20
TABELA 5: EXEMPLO DE DEPENDÊNCIA FUNCIONAL TRANSITIVA OU INDIRETA. ................................................... 20
TABELA 6: EXEMPLO DE DEPENDÊNCIA FUNCIONAL MULTIVALORADA. ............................................................... 21
TABELA 7: EXEMPLO DE DEPENDÊNCIA FUNCIONAL DE SUB-DOMÍNIO. ................................................................ 22
TABELA 8: EXEMPLO DE ATRIBUTO MULTIVALORADO. .......................................................................................... 26
TABELA 9: ISOLAMENTO DOS DADOS DA UF. ......................................................................................................... 26
TABELA 10: EXEMPLO DE ELIMINAÇÃO DE ATRIBUTOS MULTIVALORADOS. ........................................................... 26
TABELA 11: EXEMPLO DE DEPENDÊNCIA FUNCIONAL PARCIAL. ............................................................................ 27
TABELA 12: RESULTADO DA APLICAÇÃO DA 2FN. ................................................................................................. 27
TABELA 13: RESULTADO DA APLICAÇÃO DA 2FN. ................................................................................................. 27
TABELA 14: EXEMPLO DE DEPENDÊNCIA FUNCIONAL TRANSITIVA OU INDIRETA. ................................................. 28
TABELA 15: RESULTADO DA APLICAÇÃO DA 3FN. ................................................................................................. 28
TABELA 16: RESULTADO DA APLICAÇÃO DA 3FN. ................................................................................................. 28
TABELA 17: RESULTADO DA APLICAÇÃO DA 3FN. ............................................. ERRO! INDICADOR NÃO DEFINIDO.
TABELA 18: EXEMPLO DE INDEPENDÊNCIA FUNCIONAL. ....................................................................................... 30
TABELA 19: NOTAÇÃO MER VS NOTAÇÃO MPC .................................................................................................. 32
TABELA 20: RESULTADO DA IMPORTAÇÃO DE UM ARQUIVO XML......................................................................... 39
TABELA 21: EXEMPLO DE CAMPO MULTIVALORADO. ............................................................................................. 46
TABELA 22: TRANSFORMAÇÃO DE CAMPO MULTIVALORADO EM NOVAS LINHAS. .................................................. 47
TABELA 23: TRANSFORMAÇÃO DE CAMPO MULTIVALORADO EM NOVAS COLUNAS. .............................................. 47
TABELA 24: TRANSFORMAÇÃO DE CAMPO MULTIVALORADO EM VALOR ÚNICO. ................................................... 47
TABELA 25: EXEMPLO GERAL DE DEPENDÊNCIA FUNCIONAL. ................................................................................ 51
TABELA 26: RESULTADO DA ANÁLISE DE RELACIONAMENTOS. .............................................................................. 52
TABELA 27: EXCEÇÕES DA DEPENDÊNCIA FUNCIONAL SIGLA NOME. ............................................................ 53
4
LISTA DE FIGURAS
FIGURA 1: ENGENHARIA REVERSA DE ARQUIVOS. ................................................................................................. 16
FIGURA 2: AS FORMAS NORMAIS E SUAS INTERDEPENDÊNCIAS. ............................................................................ 24
FIGURA 3: FUNCIONAMENTO GERAL DA FERRAMENTA. .......................................................................................... 35
FIGURA 4: EXEMPLO DE XML (CATÁLOGO DE CDS). ............................................................................................ 38
FIGURA 5: TELA DO MÓDULO DE IMPORTAÇÃO. ..................................................................................................... 40
FIGURA 6: TELA DO MÓDULO DE ANÁLISE PRELIMINAR......................................................................................... 42
FIGURA 7: TELA DO MÓDULO DE ELEIÇÃO DA CHAVE PRIMÁRIA. .......................................................................... 45
FIGURA 8: TELA DO MÓDULO DA 1FN. ................................................................................................................... 48
FIGURA 9: TELA DO MÓDULO DA 2FN. ................................................................................................................... 54
FIGURA 10: TELA DO MÓDULO DA 3FN. ................................................................................................................. 56
5
LISTA DE COMANDOS SQL
SQL 1: MENSURAÇÃO DO RELACIONAMENTO ENTRE DOIS CAMPOS. ...................................................................... 51
6
LISTA DE REDUÇÕES
SGBD
Sistema de Gerenciamento de Bancos de Dados
ER
Entidade-Relacionamento
MER
Modelo Entidade-Relacionamento
MRP
Modelo Restrição de Participação
XML
Extended Markup Language
ñn
Não normalizada
7
1
INTRODUÇÃO
1.1
Visão Geral
A normalização de tabelas foi proposta por Edgar Frank Codd, em 1970,
juntamente com o próprio modelo de dados relacional, como uma técnica para
eliminar redundâncias de informações e evitar anomalias causadas pela inserção,
atualização e remoção de registros [1]. A aplicação desta técnica não é trivial,
exigindo conhecimento sobre formas normais e dependências funcionais, além da
teoria de bancos de dados relacionais. O sucesso da normalização depende,
também, da intimidade do projetista com o domínio dos dados.
O cerne da normalização reside na identificação de dependências funcionais,
que são relacionamentos especiais entre entidades e atributos, sendo explicadas em
detalhes no capítulo 2. Uma vez identificadas, as dependências funcionais são
eliminadas sistematicamente, de acordo com sua classificação, através da
decomposição das entidades em entidades mais simples. A aplicação desta
decomposição, embora utilize um mapeamento padrão entre tipos de dependências
funcionais e operações de decomposição de entidades, é de difícil automatização,
tendo em vista a alta dependência humana durante a identificação de dependências
funcionais válidas para o domínio de dados em questão.
A normalização é parte fundamental da engenharia reversa de arquivos de
dados, conhecida também como projeto de banco de dados bottom-up, onde, em
linhas gerais, parte-se de um esquema de dados já implementado em direção aos
conceitos do domínio que o geraram [2]. A engenharia reversa é uma funcionalidade
muito comum em ferramentas de modelagem de bancos de dados, como ERwin
(Computer Associates) [16], ER Studio (Embarcadero) [17], DB Designer
8
(fabFORCE) [18], Toad Data Modeler (Quest Software) [19], entre outras. Essas
ferramentas são capazes de automatizar grande parte do processo de transporte
dos dados de seus arquivos originais para o banco de dados de destino, gerar o
esquema lógico e, por fim, gerar o modelo conceitual. A automatização que estas
ferramentas oferecem, no entanto, não cobre a etapa de normalização, cuja
aplicação continua a cargo do projetista [3].
No âmbito acadêmico, há poucos artigos que abordam a descoberta de
dependências funcionais utilizando análises sobre as informações disponíveis, como
o código da aplicação, esquemas de dados, ou até mesmo os dados. Mesmo assim,
quando o fazem, é dentro do contexto da engenharia reversa [5, 6, 7, 8]. As
propostas para automatização partem de uma série de informações a respeito dos
dados
originais, cuja disponibilidade e qualidade geralmente são baixas,
principalmente para arquivos de sistemas legados, o que compromete os seus
resultados.
Percebe-se,
assim,
que
a
normalização
ainda
é
uma
tarefa
predominantemente manual, onde o conhecimento do projetista tem total impacto
sobre a qualidade dos esquemas lógico e conceitual resultantes.
Para atenuar tal impacto, este trabalho propõe uma ferramenta para apoiar a
etapa de normalização de tabelas, com foco no auxilio à descoberta de
dependências funcionais visando diminuir a necessidade de conhecimento teórico e
do domínio dos dados por parte do projetista. A ferramenta transporta os dados de
um arquivo de texto ou XML para uma tabela, analisa os dados e monta uma base
de informações para apoiar a aplicação de cada passo da normalização, solicitando
a intervenção do usuário apenas quando as informações extraídas não são capazes
de decidir por uma decomposição com segurança. Em cada passo, são
9
apresentadas as regras que compõem cada forma normal, utilizando exemplos com
os próprios dados de entrada. O resultado do processo é um conjunto de tabelas
normalizadas.
1.2
Objetivos
1.2.1 Geral
Desenvolver uma ferramenta de apoio à normalização de tabelas com base
na análise de uma fonte de dados, de modo a diminuir o impacto do conhecimento
do projetista sobre o resultado da normalização.
1.2.2 Específicos
• Oferecer suporte à importação de dados contidos em arquivos de texto ou
XML;
• Oferecer uma etapa de pré-processamentos dos dados de entrada, para
que cada campo seja armazenado da melhor forma possível (literal,
numérico, etc.) e tenha uma nomenclatura mais inteligível;
• Auxiliar a definição da chave primária, que é pré-requisito da normalização;
• Aplicar as formas normais, solicitando a concordância do usuário em cada
passo;
• Informar ao usuário os conceitos envolvidos em cada decomposição
efetuada;
• Apresentar relatório com as tabelas resultantes;
• Apresentar a diferença entre o espaço alocado pelos dados antes e depois
da normalização.
10
1.3
Justificativa
A normalização, em projetos de bancos de dados, pode ser vista como uma
etapa de garantia de conformidade e qualidade, onde as tabelas são analisadas e
submetidas a um grande conjunto de alterações sistemáticas até alcançar certo nível
de otimização, balanceado e estipulado pelo próprio projetista.
As propostas para automatizar esta etapa dependem da disponibilidade de
modelos e descrições a respeito da estrutura dos dados, que nem sempre estão
disponíveis. Além disso, é necessário conhecer o domínio dos dados para aplicar
uma normalização adequada, o que pode levar muito tempo, dependendo do
domínio.
A combinação destes fatores faz com que esta etapa seja encarada como um
preciosismo acadêmico, pelo tempo que consome, e enfadonha, pela carga de
conhecimento teórico que requer. Como resultado, a normalização é freqüentemente
ignorada, deixando a qualidade do projeto fortemente dependente da experiência do
projetista, o que raramente gera bons resultados. Além disso, revela imaturidade da
empresa com relação a suas metodologias de desenvolvimento.
1.4
Metodologia
Para que os objetivos, há pouco expostos, sejam alcançados, este trabalho
segue as etapas abaixo elencadas:
• Estudo sobre a normalização de dados e conceitos relacionados;
• Levantamento do estado da arte na área;
• Implementação da ferramenta;
• Apresentação de um estudo de caso.
11
Na primeira etapa, são apresentadas as teorias sobre as quais a
normalização se apóia, com exemplos descritivos e ilustrativos para auxiliar a
compreensão dos mesmos.
A segunda etapa consiste em uma pesquisa sobre trabalhos relacionados a
alguma forma de suporte automatizado ao processo de normalização, com o intuito
de se determinar o avanço tecnológico na área e incorporar conceitos úteis ao
trabalho.
A terceira etapa refere-se à implementação da ferramenta, que consiste na
definição dos algoritmos para importação, pré-processamento, determinação de
chave primária, descoberta de relacionamentos, migração de atributos para novas
tabelas e desenvolvimento da interface gráfica.
Na quarta etapa, é feito um estudo de caso onde um arquivo de dados é
normalizado manualmente e através da ferramenta, sendo os resultados analisados.
1.5
Estrutura do Trabalho
Este trabalho está dividido da seguinte forma:
• Capítulo 1: Introdução – Este capítulo contextualiza a normalização de
tabelas e apresenta o trabalho de forma geral, comentando sobre seus
objetivos gerais e específicos, justificativa, metodologia e organização;
• Capítulo 2: Fundamentação Teórica – Este capítulo apresenta os conceitos
de engenharia reversa de arquivos e modelos relacionais, normalização de
tabelas, dependência funcional e formas normais;
• Capítulo 3: Trabalhos Relacionados – Este capítulo comenta artigos
relacionados ao trabalho e faz uma análise sobre o estado da arte em
normalização;
12
• Capítulo 4: A Ferramenta – Este capítulo descreve a arquitetura,
composição e funcionamento da ferramenta, passando pelos módulos de
importação, pré-processamento, eleição de chave primária, 1FN, 2FN e
3FN e resultados;
• Capítulo 5: Estudo de Caso – Este capítulo apresenta a normalização de
um arquivo de dados através da ferramenta, passo a passo, de forma mais
leve e menos formal, ressaltando os aspectos acadêmicos da mesma;
• Capítulo 6: Conclusões – Este capítulo apresenta as conclusões extraídas
do estudo de caso e do trabalho em geral. Ele aponta ainda aspectos do
trabalho e da ferramenta que não estavam dentro de escopo e que podem
ser incorporados em trabalhos futuros.
13
2
FUNDAMENTAÇÃO TEÓRICA
2.1
Engenharia Reversa
2.1.1 Visão Geral
Em linhas gerais, pode-se definir a engenharia reversa como um processo de
abstração, cujo objetivo é obter um modelo conceitual a partir de um modelo
implementado [2]. No escopo de bancos de dados, a engenharia reversa é utilizada
inicialmente para extrair modelos lógicos de conjuntos de dados não relacionais,
num processo denominado “engenharia reversa de arquivos”. Este processo é
composto por várias tarefas, sendo seguido por outro processo, chamado de
“engenharia reversa de modelos relacionais”, cujo objetivo é gerar modelos
conceituais a partir de modelos lógicos. Há muitas outras aplicações para a
engenharia reversa, mas não são abordadas neste trabalho por estarem fora do
escopo do mesmo.
2.1.2 Engenharia Reversa de Arquivos
Grande parte dos sistemas de informação utilizados ainda hoje foi
desenvolvida no decorrer dos últimos 20 anos, em linguagens de terceira geração
como COBOL e Basic, utilizando bancos de dados pré-relacionais como IMS ou
ADABAS, sendo conhecidos como “sistemas legados” [2]. Estes sistemas raramente
apresentam documentação e, quando existe, é pobre, tornando freqüentemente as
manutenções e os melhoramentos mais caros que um projeto novo.
O modelo conceitual é vital para que pessoas que não conhecem o sistema
tenham condições de assimilar seu funcionamento e participar de discussões a
14
respeito de alterações e melhorias do mesmo. O processo de migração de bancos
de dados legados para tecnologias mais atuais, como bancos de dados relacionais e
não-convencionais, também é prejudicado pela falta de esquemas conceituais,
fazendo com que os dados tenham que ser modelados praticamente do zero.
Em geral, a engenharia reversa de arquivos pode ser dividida nas seguintes
etapas:
• Conversão da descrição de arquivos em tabelas relacionais ÑN: Converte a
descrição de cada arquivo existente para um esquema relacional não
normalizado. Neste passo inicial, obtém-se a independência dos tipos de
arquivo importados, já que são todos transformados em uma estrutura
tabular;
• Normalização: Reagrupa as informações para eliminar redundâncias e
evitar anomalias ocasionadas pela atualização de registros. Esta técnica é
detalhada mais adiante;
• Integração de esquemas: Gera o esquema relacional completo através da
integração dos esquemas relacionais normalizados de cada arquivo. Como
a integração de normalizados não gera, necessariamente, um esquema
integrado já normalizado, esta etapa conta ainda com um passo de
eliminação de redundâncias entre as tabelas;
• Extração do esquema Entidade-Relacionamento (ER): Por fim, o esquema
ER é extraído, aplicando-se a engenharia reversa de modelos relacionais
sobre o conjunto de esquemas relacionais integrados. Esta etapa também
é detalhada mais adiante.
A Figura 1 oferece uma visão geral destas etapas.
15
Figura 1: Engenharia Reversa de Arquivos.
2.2
Dependência Funcional
2.2.1 Visão Geral
Diz-se que um atributo A determina um atributo B, ou que B depende
funcionalmente de A, quando, para cada valor de A, o valor de B é sempre o mesmo,
para todos os registros da tabela [4]. A Tabela 1 exemplifica esse conceito.
16
Tabela 1: Exemplo de Dependência Funcional.
DATA
13/09/2007
13/09/2007
14/09/2007
14/09/2007
15/09/2007
15/09/2007
TEMPERATURAS_MUNICIPIOS
BASE
TABELA
MUNICIPIOS FLORIANOPOLIS
MUNICIPIOS
SAO JOSE
MUNICIPIOS FLORIANOPOLIS
MUNICIPIOS
SAO JOSE
MUNICIPIOS FLORIANOPOLIS
MUNICIPIOS
SAO JOSE
REGISTROS
321654
425658
322654
426547
323547
428452
Analisando-se o relacionamento entre BASE e TABELA, verifica-se que cada
valor do atributo TABELA está relacionado com o mesmo valor do atributo BASE em
todos os registros. Pode-se afirmar, então, que TABELA determina BASE, ou que
TABELA BASE, pela notação formal. Pode-se dizer também que TABELA é o
determinante da dependência funcional. Se fosse inserido na Tabela 1, por exemplo,
um registro onde o valor “FLORIANOPOLIS”, do campo TABELA, aparece
relacionado com um valor diferente de “MUNICIPIOS”, no campo BASE, a
dependência funcional entre estes campos seria quebrada.
A relação entre os campos da dependência funcional e a chave primária
define o tipo de dependência funcional encontrada. Neste trabalho, os campos
sublinhados indicam a chave primária.
2.2.2 Chave Única e Primária
Cada conjunto de um ou mais atributos capaz de identificar unicamente uma
ocorrência de entidade em uma relação é chamado de chave única ou chave
candidata. As chaves podem ser simples, se constituídas de apenas um atributo, ou
compostas, se constituídas de mais de um atributo. A chave primária tende a ser
sempre o menor desses conjuntos e deve considerar não apenas as entidades
17
existentes (em uma relação populada ou amostra), mas todas as entidades que
possam vir a existir. A Tabela 2 esclarece este conceito:
Tabela 2: Exemplo de Chave Primária.
COORDENADAS_MUNICIPIOS
LATITUDE
LONGITUDE
MUNICIPIO
-27:35 (Sul)
-48:32 (Oeste)
FLORIANOPOLIS
-27:35 (Sul)
-48:37 (Oeste)
SAO JOSE
-30:01 (Sul)
-51:13 (Oeste)
PORTO ALEGRE
-31:19 (Sul)
-54:06 (Oeste)
BAGE
-29:46 (Sul)
-55:47 (Oeste)
ALEGRETE
Neste exemplo, são chaves candidatas LONGITUDE, MUNICIPIO, LATITUDE
+ LONGITUDE, LATITUDE + MUNICIPIO, LONGITUDE + MUNICIPIO e, por fim,
LATITUDE + LONGITUDE + MUNICIPIO. Note que LATITUDE não é chave
candidata porque já apresenta valores repetidos, e que as chaves candidatas
elencadas se limitam às tuplas do exemplo. À medida que esta tabela for populada,
a chave candidata LONGITUDE, por exemplo, será invalidada, pois o campo
LONGITUDE passará a apresentar valores duplicados também. Por isso, a chave
primária não pode ser qualquer chave candidata, escolhida aleatoriamente dentre as
disponíveis. É necessário escolher a chave candidata capaz de manter a identidade
de cada registro, independentemente do número de registros na tabela. Neste
exemplo, a chave primária escolhida foi LATITUDE + LONGITUDE, pois cada
combinação de valores desses dois campos sempre define apenas um valor para
MUNICIPIO, logo, nunca se repetirá.
Uma das principais funções da chave primária é garantir a integridade da
tabela, não permitindo a inserção de registros cujos campos que compõem a chave
primária apresentem valores já existentes.
18
2.2.3 Dependência Funcional Total
Quando um atributo depende funcionalmente de todos os atributos que
compõem a chave primária, além de não fazer parte da mesma, tem-se uma
dependência funcional total. A Tabela 3 a seguir esclarece este conceito.
Tabela 3: Exemplo de Dependência Funcional Total.
LATITUDE
-27:35 (Sul)
-27:35 (Sul)
-30:01 (Sul)
-31:19 (Sul)
-29:46 (Sul)
COORDENADAS_MUNICIPIOS
LONGITUDE
ALTITUDE
-48:32 (Oeste)
3 Metros
-48:37 (Oeste)
8 Metros
-51:13 (Oeste)
3 Metros
-54:06 (Oeste)
212 Metros
-55:47 (Oeste)
102 Metros
MUNICIPIO
FLORIANOPOLIS
SAO JOSE
PORTO ALEGRE
BAGE
ALEGRETE
Neste exemplo, LATITUDE, LONGITUDE MUNICIPIO é válido. Este tipo de
relacionamento é classificado como dependência funcional total, uma vez que
MUNICIPIO depende funcionalmente de todos os atributos que compõe a chave.
2.2.4 Dependência Funcional Parcial
Quando um atributo depende funcionalmente de apenas alguns dos atributos
que compõem a chave primária, ou seja, não é necessária a combinação de todos
os campos da chave primária para determinar um dado campo, tem-se uma
dependência funcional parcial. A Tabela 4 a seguir exemplifica este conceito.
19
Tabela 4: Exemplo de Dependência Funcional Parcial.
COORDENADAS_MUNICIPIOS
LONGITUDE
ALTITUDE
-48:32 (Oeste)
3 Metros
-48:37 (Oeste)
8 Metros
-51:13 (Oeste)
3 Metros
-54:06 (Oeste)
212 Metros
-55:47 (Oeste)
102 Metros
LATITUDE
-27:35 (Sul)
-27:35 (Sul)
-30:01 (Sul)
-31:19 (Sul)
-29:46 (Sul)
Neste
exemplo,
LATITUDE,
LONGITUDE
MUNICIPIO
FLORIANOPOLIS
SAO JOSE
PORTO ALEGRE
BAGE
ALEGRETE
MUNICIPIO
é
válido,
dispensando ALTITUDE. Este tipo de relacionamento é classificado como
dependência funcional parcial, uma vez que MUNICIPIO depende funcionalmente
apenas de parte dos atributos que compõem a chave primária, ou seja, a
dependência funcional existente não seria afetada se o atributo ALTITUDE fosse
removido da tabela ou simplesmente deixasse de fazer parte da chave primária.
2.2.5 Dependência Funcional Transitiva ou Indireta
Este tipo de dependência ocorre quando a dependência funcional se realiza
entre atributos que não fazem parte da chave primária. A Tabela 5 a seguir
exemplifica este conceito.
Tabela 5: Exemplo de Dependência Funcional Transitiva ou Indireta.
REGIAO
SUL
SUL
SUL
SUL
UF
SC
SC
PR
PR
CEPS_MESORREGIOES
MESORREGIAO
GRANDE FLORIANOPOLIS
SERRANA
OESTE PARANAENSE
SUDOESTE PARANAENSE
Neste exemplo, MESORREGIAO
CEP
88036540
88625000
85864530
85601020
UF e UF REGIAO, logo,
MESORREGIAO REGIAO. Este tipo de relacionamento é classificado como
dependência funcional transitiva, ou indireta, uma vez que MESORREGIAO
20
consegue determinar, através da UF, a REGIAO. Observe que nenhum dos campos
envolvido é, ou compõe, a chave primária.
2.2.6 Dependência Funcional Multivalorada
Esta dependência ocorre quando um atributo A determina freqüentemente o
mesmo conjunto de valores em B, independentemente de fazerem parte de chave
primária ou não. A Tabela 6 a seguir exemplifica este conceito.
Tabela 6: Exemplo de Dependência Funcional Multivalorada.
MARCA
FORD
FORD
FORD
FIAT
FIAT
FIAT
FORD
FIAT
FIAT
FORD
FIAT
FORD
MODELOS
MODELO
ANO
FOCUS
1999
KA
2001
FOCUS
2002
PALIO
1998
UNO
2005
PALIO
2006
KA
1995
PALIO
2003
UNO
2001
FOCUS
2006
UNO
1993
KA
2007
QUILOMETRAGEM
95000
48000
45000
76000
13000
23000
89000
30000
65000
15000
78000
5600
Neste exemplo, MARCA MODELO, ou MARCA multidetermina
MODELO, porque para cada valor de MARCA existe um conjunto fixo de valores
possíveis para MODELO, observados em todos os registros. Este tipo de
relacionamento é classificado como dependência funcional multivalorada.
2.2.7 Dependência Funcional de Sub-Domínio
Esta dependência ocorre quando A B não ocorre, mas existe pelo menos
um valor de A que sempre se relaciona com apenas um valor em B. Em outras
21
palavras, se trata de uma dependência funcional detectada em apenas alguns
valores dos campos. A Tabela 7 a seguir exemplifica este conceito.
Tabela 7: Exemplo de Dependência Funcional de Sub-Domínio.
PRODUTOS
NOME
MEDIDA UNIDADES
MARGARINA
250 gr
100
MARGARINA
500 gr
250
OLEO
1000 ml
150
REFRIGERANTE 250 ml
500
REFRIGERANTE 350 ml
100
REFRIGERANTE 1000 ml
1250
OLEO
900 ml
75
LEITE
1000 ml
400
Neste exemplo, NOME MEDIDA não ocorre, pois há valores de NOME que
se relacionam com mais de um valor de MEDIDA. No entanto, o valor “LEITE”, do
campo NOME, relaciona-se apenas com o valor “1000 ml”, no campo MEDIDA. Este
tipo de relacionamento é classificado como dependência funcional de subdomínio.
2.2.8 Anomalias de Alteração
A detecção de dependências funcionais não totais indica que a tabela possui
redundância e, conseqüentemente, está sujeita a anomalias de inserção, atualização
e remoção. As anomalias são as seguintes:
• Anomalias de inserção: Ocorrem quando um registro é inserido em uma
tabela sem que todos os seus atributos tenham sido determinados. No
exemplo da Tabela 4, a inserção de um novo município vinculado a uma UF
e região implicaria a atribuição de uma temperatura nula. Uma alternativa
seria inserir o novo município apenas quando sua temperatura estiver
disponível também. De qualquer forma, não é o comportamento adequado;
22
• Anomalias de alteração: Ocorrem quando um atributo é modificado apenas
em alguns registros em que ocorre. No exemplo acima, caso a sigla de
alguma das unidades federativas fosse alterada, seria necessário efetuar a
alteração em todas as ocorrências daquela sigla, exigindo a varredura
completa da tabela. Caso esta alteração seja efetuada apenas em parte de
suas ocorrências, a tabela fica inconsistente, retornando siglas distintas
para a mesma UF;
• Anomalias de remoção: Ocorrem quando a remoção de algum atributo
causa a perda de outras informações relacionadas. Ainda no exemplo
acima, a remoção de um município implicaria a perda da unidade federativa
e sua sigla.
Para evitar as anomalias supracitadas, é necessário detectar e eliminar as
dependências funcionais não totais, ou seja, decompor a tabela em outras tabelas
que não possuam mais redundância.
2.3
O Processo de Normalização
A normalização é um processo composto por algumas regras, chamadas
formas normais, cujo objetivo principal é eliminar a redundância nos dados
armazenados em tabelas, resultando na diminuição do espaço ocupado pelos
mesmos e dos riscos de anomalias de alteração [4]. Quando um atributo é alterado
em uma tabela que não está totalmente normalizada, é necessário alterá-lo em
todas as linhas em que ele ocorre, haja vista a sua repetição. Tal operação poderia
ser executada apenas uma vez, caso este atributo estivesse normalizado.
23
As principais formas normais encontradas na literatura são mostradas na
Figura 2.
Figura 2: As Formas Normais e suas interdependências.
As formas normais mantêm uma relação entre si de tal sorte que a 2FN, a
exemplo, se “apóia” sobre a 1FN, ou então que implica a 1FN, a 3FN implica a 2FN,
e assim sucessivamente. As regras das três primeiras formas normais são as
seguintes:
• 1ª Forma Normal (1FN): Para que uma tabela obedeça à 1FN, não deve
possuir atributos multivalorados, tão pouco tabelas aninhadas. O fato de os
dados estarem dentro de uma tabela relacional com uma chave primária já
indica certa conformidade com a 1FN. No entanto, campos cujos valores
são uma série de outros valores, separados por vírgula, tabulação ou outra
forma qualquer, são de mais difícil detecção, e geralmente representam
casos de campos multivalorados. Por isso, é preciso que se observe
algumas instâncias aleatórias dos dados para que se tenha certeza de que
não há campos multivalorados entre elas. Algumas técnicas são propostas
para decompor uma estrutura aninhada em uma tabela na 1FN, como por
exemplo, a geração de uma tabela para cada nível de aninhamento ou a
geração de uma tabela única para todos os dados;
24
• 2ª Forma Normal (2FN): Uma tabela está na 2FN se, e somente se, estiver
na 1FN e não apresentar dependências funcionais parciais;
• 3ª Forma Normal (3FN): Uma tabela está na 3FN se, e somente se, estiver
na 2FN e todo atributo não-chave depende funcionalmente diretamente da
chave primária, ou seja, não há dependências entre atributos não chave.
As demais formas normais estão fora do escopo deste trabalho, porque
exigem análises mais complexas de dependências funcionais, cujo tempo de
processamento pode não justificar o benefício, em tabelas com muitos registros.
Além disso, a ocorrência destas formas normais é muito mais rara na prática.
A Tabela LOCALIDADES a seguir (Tabela 8) apresenta um exemplo de
atributo multivalorado no campo MUNICIPIOS, que não é permitido segundo a 1FN.
Após a aplicação da 1FN, a tabela LOCALIDADES é decomposta em duas novas
tabelas: UFS (Tabela 9) e MUNICIPIOS (Tabela 10). Todos os atributos originais de
LOCALIDADES
são
migrados
para UFS, exceto o atributo multivalorado
MUNICIPIOS, que, para entrar em conformidade com a 1FN, deve ter um registro
para cada valor, motivo pelo qual é acomodado na tabela MUNICIPIOS. Para que
não se perca o relacionamento entre UF e MUNICIPIOS, o atributo ID_UF migra
também para MUNICIPIOS, preservando uma propriedade fundamental da
normalização: a capacidade de se desfazer todas as decomposições efetuadas,
gerando a tabela original novamente [4].
25
Tabela 8: Exemplo de atributo multivalorado.
LOCALIDADES
ID
1
2
3
REGIAO
SUL
SUL
SUL
UF
SC
RS
PR
MUNICIPIOS
FLORIANOPOLIS, SAO JOSE, CRICIUMA
BAGE, ALEGRETE, CANDIOTA
ATALAIA, MARINGA, SARANDI
Tabela 9: Isolamento dos dados da UF.
ID
1
2
3
UFS
REGIAO
SUL
SUL
SUL
UF
SC
RS
PR
Tabela 10: Exemplo de eliminação de atributos multivalorados.
ID
1
2
3
4
5
6
7
8
9
MUNICIPIOS
MUNICIPIO
FLORIANOPOLIS
SAO JOSE
CRICIUMA
CANDIOTA
ALEGRETE
BAGE
SARANDI
MARINGA
ATALAIA
ID_UF
1
1
1
2
2
2
3
3
3
A Tabela ATUACOES (Tabela 11) apresenta um exemplo de dependência
funcional parcial, provocada pelo atributo NOME, que depende funcionalmente de
apenas um dos atributos que compõem a chave primária, ID_ATOR. Para obedecer
à 2FN, o atributo NOME é migrado para uma nova tabela ATORES (Tabela 13),
levando junto o atributo ID_ATOR, mantendo assim o relacionamento existente. A
tabela original ATUACOES (Tabela 11) é reconstruída (Tabela 12), agora sem o
atributo migrado.
26
Tabela 11: Exemplo de Dependência Funcional Parcial.
ID_FILME
1
1
2
3
4
5
ID_ATOR
1
2
3
4
5
6
ATUACOES
NOME
BRAD PITT
JULIA ROBERTS
NATALIE PORTMAN
ANTONIO BANDERAS
LUCY LIU
CLAIRE FORLANI
PERSONAGEM
RUSTY RYAN
TESS OCEAN
ALICE
CARLOS RUEDA
ALEX MUNDAY
SUSAN PARRISH
Tabela 12: Resultado da aplicação da 2FN.
ID_FILME
1
1
2
3
4
5
ATUACOES
ID_ATOR
PERSONAGEM
1
RUSTY RYAN
2
TESS OCEAN
3
ALICE
4
CARLOS RUEDA
5
ALEX MUNDAY
6
SUSAN PARRISH
Tabela 13: Resultado da aplicação da 2FN.
ID_ATOR
1
2
3
4
5
6
ATORES
NOME
BRAD PITT
JULIA ROBERTS
NATALIE PORTMAN
ANTONIO BANDERAS
LUCY LIU
CLAIRE FORLANI
A tabela VENCIMENTOS (Tabela 14) apresenta um exemplo de dependência
funcional provocada pelo atributo SALARIO, que depende funcionalmente do
atributo CATEGORIA. Neste caso, como o atributo CATEGORIA não faz parte da
chave, esta dependência funcional é denominada INDIRETA ou TRANSITIVA, ou
seja, ocorre apenas entre atributos não-chave. Para obedecer à 3FN, o atributo
SALARIO é migrado para a nova tabela CATEGORIAS (Tabela 16), levando junto o
atributo CATEGORIA, mantendo assim o relacionamento existente. A tabela original
27
VENCIMENTOS (Tabela 14) é reconstruída (Tabela 15), agora sem o atributo
migrado.
Tabela 14: Exemplo de Dependência Funcional Transitiva ou Indireta.
ID_FUNCIONARIO
1
1
2
3
4
5
VENCIMENTOS
NOME
CATEGORIA
JOAO
OPERAÇÃO
MARCOS
OPERAÇÃO
ANA
SECRETARIA
JULIA
SECRETARIA
VITOR
ADMINISTRAÇÃO
ANGELA
ADMINISTRAÇÃO
SALARIO
600,00
600,00
450,00
450,00
1000,00
1000,00
Tabela 15: Resultado da aplicação da 3FN.
FUNCIONARIOS
ID_FUNCIONARIO
NOME
CATEGORIA
1
JOAO
OPERAÇÃO
1
MARCOS
OPERAÇÃO
2
ANA
SECRETARIA
3
JULIA
SECRETARIA
4
VITOR
ADMINISTRAÇÃO
5
ANGELA
ADMINISTRAÇÃO
Tabela 16: Resultado da aplicação da 3FN.
CATEGORIAS
NOME
SALARIO
OPERADOR
600,00
SECRETARIA
450,00
ADMINISTRADOR 1000,00
28
3
TRABALHOS RELACIONADOS
Os trabalhos que mais se aproximam do trabalho aqui proposto estão
relacionados com a automatização da engenharia reversa de bancos de dados, cujo
objetivo é, em linhas gerais, obter um esquema conceitual a partir de um esquema
implementado [1]. Os processos propostos utilizam documentos físicos, esquemas,
análise de dependências funcionais, código fonte da aplicação, SQL e os próprios
dados. No entanto, não há abordagem que se proponha a normalizar um conjunto de
dados utilizando apenas a análise dos mesmos e dispensando o conhecimento
sobre o seu domínio. Isto se deve, em parte, porque a normalização é apenas uma
etapa do processo de engenharia reversa e raramente é abordada fora deste
escopo.
3.1
A Independência Funcional na Normalização de Bancos de Dados
Relacionais
Este trabalho aponta deficiências na definição das formas normais baseadas
em dependências funcionais e apresenta uma abordagem complementar ao
processo tradicional de normalização, introduzindo o conceito de independência
funcional, melhorando sensivelmente o resultado da normalização [9].
Segundo o trabalho, a eliminação das dependências funcionais não é
suficiente para evitar algumas formas básicas de redundância, resultando em
anomalias de alteração nos dados mesmo em altos níveis de normalização. Para
eliminar anomalias causadas pelas dependências funcionais de subdomínio, o artigo
introduz o conceito de independência funcional, que acontece quando a combinação
29
de todos os valores entre dois atributos é válida, ou seja, não fere nenhuma restrição
semântica. A Tabela 17 esclarece este conceito.
Tabela 17: Exemplo de Independência Funcional.
CONTAS
CORRENTISTA
SALDO
JOAO
-50,00
GISELE
654,21
ANA
1684,32
GABRIEL
-320,15
CAROL
521,78
A Tabela 17 apresenta dois campos funcionalmente independentes, ou
CORRENTISTA >< SALDO, pela notação formal, porque não há restrições para as
combinações de valores que os campos podem assumir. O exemplo de
independência funcional, dado na Tabela 17, só é válido quando acrescido de
informações externas, como o fato de que um correntista pode ter qualquer valor em
seu saldo. No entanto, regras simples de negócio podem invalidar o exemplo, como
considerar que correntistas com menos de um ano de conta têm limite máximo de
R$ 200,00. Por esse motivo, as independências funcionais não são determinadas
pela combinação exaustiva dos atributos, mas pela consulta à semântica dos
mesmos, tornando-as altamente dependentes do domínio dos dados.
Por fim, o trabalho utiliza o conceito de independência funcional para definir a
Forma Normal da Independência Funcional (FINF). Uma tabela está na FINF se, e
somente se, estiver na FNBC e, em todos os pares de atributos “X” e “Y”, for
verificado que X Y ou Y X ou X >< Y, o que implica a ausência de
redundâncias causadas por dependências funcionais de subdomínio e outras formas
de relacionamento entre atributos. A FNBC exige que todos os atributos
funcionalmente determinantes façam parte da chave primária.
30
Esta proposta contribuiu para este trabalho com a teoria de independência
funcional e a forma normal FINF.
3.2
Engenharia Reversa de Bancos de Dados Relacionais: Algoritmos para
Extrair Restrições de Cardinalidade
Este trabalho trata da extração de cardinalidades via comandos SQL, gerados
dinamicamente sobre um dicionário de dados, para otimizar a engenharia reversa de
bancos de dados [3]. Os resultados podem ser aplicados para esquemas ER,
MERISE, ECR, ERC+, OMT e ODMG, ou ainda na integração de ferramentas
comerciais que oferecem engenharia reversa de bancos de dados.
A motivação está na complexidade do processo de engenharia reversa, cujas
abordagens exigem a satisfação de uma série extensa e complexa de requisitos,
impedindo a automatização, bem como na falta de abordagens que utilizem os
próprios dados para dar mais consistência ao esquema extraído.
A análise dos dados armazenados em um banco ou fonte de dados traz
informações muito mais realistas a respeito das entidades ali persistidas do que o
código fonte da aplicação e a descrição dos dados sozinhos. Todavia, as
ferramentas que oferecem engenharia reversa ignoram os dados, tomando como
entrada apenas dicionários de dados ou descrições do esquema relacional.
Incluir a análise dos dados no processo, como propõe o trabalho, possibilita a
identificação precisa das cardinalidades existentes entre as entidades. A precisão
desta informação é que separa processos de engenharia reversa em bem ou mal
sucedidos.
Quando as definições de entidades incluem as chaves primárias e
estrangeiras no nível relacional, a ferramenta efetua a engenharia reversa
31
automaticamente. Caso contrário, o usuário deve indicar manualmente os camposalvo a serem analisados pela ferramenta e refazer o processo até obter um resultado
que julgue satisfatório.
O trabalho analisa as diferenças entre os modelos baseados em restrições de
cardinalidades (MER), como o ER, e os modelos baseados em restrições de
pertinência (MPC), como MERISE, ECR, ERC+, OMT e ODMG. A Tabela 18
apresenta as diferenças entre as notações MER e MPC.
Tabela 18: Notação MER VS Notação MPC
Relacionamento
Aluno VS Matrícula
Banca VS
Professores
Aluno VS Email
Aluno VS Turma
Descrição
Um aluno tem apenas uma matrícula,
e uma matrícula identifica apenas um
aluno
Uma banca pode ter de dois a quatro
professores, e um professor pode
fazer parte de zero ou mais bancas
Um aluno pode ter zero ou mais
emails, e um email pertence a
apenas um aluno
Um aluno pode estar alocado a uma
ou mais turmas, e uma turma pode
conter zero ou mais alunos
Notação
MER
MPC
1:1
[1:1]:[1:1]
n:m
[0:n]:[2:4]
1:n
[1:1]:[0:n]
n:m
[0:n]:[1:n]
A identificação e representação adequada das cardinalidades, apresentada
neste trabalho, deu origem ao módulo de análise preliminar da ferramenta proposta,
haja vista a importância que essa informação tem para o processo de normalização.
3.3
Extraindo o Diagrama ER de Bancos de Dados Legados
Este trabalho propõe um processo de extração de um diagrama ER de um
banco de dados não relacional, com pouca informação sobre os campos e nenhuma
informação sobre as chaves, analisando os próprios dados armazenados e telas de
32
formulário do sistema que alimenta o banco [10]. A motivação reside na presunção
de disponibilidade de todas essas informações para se iniciar um processo de
engenharia reversa, o que raramente acontece. Ao final, um estudo de caso é
apresentado.
A semântica dos dados é descoberta através do preenchimento dos
formulários do sistema e análise do posterior armazenamento das informações de
entrada no banco de dados. Para automatizar o procedimento de análise e extração,
são criadas tabelas no SQL Server para armazenar informações sobre formulários,
campos de formulários, tabelas e campos de tabelas do sistema.
As chaves são inferidas pela análise de arquivos de índices ou, para tabelas
sem arquivo de índices, a eleição de chaves é feita através da análise direta dos
dados da tabela a procura de campos, ou combinações de campos, cujos valores
não se repitam. Em seguida, todas as tabelas são percorridas para se descobrir
quais delas fazem referência às chaves primárias definidas na etapa anterior,
descobrindo assim as chaves estrangeiras.
As cardinalidades entre as chaves primárias e estrangeiras são obtidas pela
contagem do número de valores distintos de cada chave estrangeira para uma chave
primária.
Grande parte das pesquisas nesta área de extração de esquemas conceituais
de dados baseia-se na utilização do esquema relacional como entrada principal. No
entanto, a manutenção de um banco de dados depende do conhecimento que se
tem sobre suas características. A semântica de seus atributos é vital para a
compreensão do funcionamento do sistema, e geralmente é pobre ou até mesmo
inexistente, justificando abordagens como esta, que utilizam a análise dos
formulários do sistema para ajudar na reconstrução de esquemas ER.
33
Este trabalho deu origem ao módulo de eleição de chave primária de
ferramenta proposta, que é pré-requisito da normalização.
3.4
Considerações Finais
Estes trabalhos contribuíram para o amadurecimento geral da ferramenta,
além dos conceitos especificados na análise de cada um. No entanto, este trabalho
se diferencia das abordagens apresentadas ao propor uma ferramenta de apoio à
normalização que utiliza apenas os dados como entrada, dos quais extrai as
informações
necessárias
para
efetuar
grande
parte
da
normalização
automaticamente.
Outro aspecto é a disponibilização de uma interface com o usuário dotada de
recursos para apresentar a teoria envolvida em todo o processo de normalização,
distribuindo-a em módulos e passos.
34
4
A FERRAMENTA
A ferramenta proposta neste trabalho tem por objetivo apoiar o processo de
normalização de tabelas até a 3FN, reduzindo a necessidade de conhecimento
teórico a respeito da normalização e conhecimento sobre o domínio dos dados, além
de explicar a teoria envolvida em cada parte do processo.
A Figura 3 apresenta uma visão geral do funcionamento da ferramenta.
Figura 3: Funcionamento geral da ferramenta.
4.1
Funcionamento Geral
A entrada da ferramenta é um arquivo de dados em texto ou XML. Os dados
contidos neste arquivo são importados para uma única tabela relacional não
normalizada, que serve de base para todo o resto do processo.
35
A aplicação das formas normais exige a existência de uma chave primária.
Para auxiliar o usuário na definição dessa chave, a ferramenta analisa os dados e
calcula o potencial que cada campo tem para exercer essa função. Em seguida,
apresenta uma lista de campos de maior potencial, com os quais o usuário deve
compor a chave primária.
Definida a chave primária, o usuário pode então aplicar a 1FN, 2FN e, por fim,
a 3FN. Nesta etapa, a tabela sofre a aplicação de cada uma das formas normais em
passos separados, nos quais a ferramenta identifica, classifica e remove cada
dependência funcional encontrada, além de apresentar a teoria relacionada a cada
uma delas.
Ao término do processo, são apresentadas as tabelas resultantes da
normalização, juntamente com relatórios sobre tempos de execução de cada tarefa e
a diferença entre o espaço utilizado pelos dados antes e depois da normalização.
Esta última informação, em particular, é apresentada no intuito de evidenciar um dos
principais resultados da aplicação da normalização, que é justamente a redução no
tamanho dos dados.
As principais funcionalidades da ferramenta estão divididas em módulos e são
explicadas minuciosamente mais adiante.
4.2
Tecnologias Utilizadas
A plataforma da aplicação é toda desenvolvida em SQL, sendo constituída de
tabelas responsáveis por manter os dados resultantes das análises e stored
procedures que encapsulam os algoritmos de cada tarefa utilizada pela ferramenta.
Por definição, uma dependência funcional ocorre entre dois atributos se, e somente
se, for verdadeira para todos os registros da tabela [1]. Caso contrário, sua
36
existência não pode ser afirmada. Para que algoritmos baseados neste princípio
possam ser aplicados com segurança, sería necessária uma etapa de tratamento
dos dados, onde estes seriam limpos e padronizados, para que então pudessem ser
analisados pela ferramenta. Para evitar a dependência de uma etapa de tratamento,
foram desenvolvidos outros algoritmos, cuja saída não indica simplesmente se uma
determinada dependência funcional existe ou não, e sim a intensidade em que
ocorre, possibilitando a análise final por parte do projetista.
A padronização do SQL permite que os algoritmos sejam incorporados a
qualquer outro SGBD Relacional com suporte a stored procedures e capacidade de
montar e executar comandos SQL dinamicamente.
O sistema gerenciador de bancos de dados escolhido foi o MySQL 5.1, por
ser gratuito, muito utilizado no meio acadêmico e, principalmente, oferecer suporte à
execução dinâmica de SQL. A interface gráfica foi desenvolvida utilizando-se a
versão 5.5.1 do Netbeans, uma IDE para a linguagem Java.
4.3
Módulos
4.3.1 Módulo de Importação
Este módulo extrai os dados de um arquivo de texto ou XML e insere em uma
tabela. Para arquivos de texto, o usuário define os critérios (caracteres) que serão
utilizados para quebrar os registros em linhas e colunas, não sendo necessário que
o usuário conheça a formatação do arquivo. Basta utilizar a funcionalidade de prévisualização da importação, onde é possível observar uma amostra dos dados e
descobrir quais caracteres separam as linhas e colunas, informá-los à ferramenta e
solicitar a pré-visualização de como os dados ficariam após a importação. Desse
modo, o usuário pode testar diferentes separadores de linha e coluna até chegar a
37
um resultado que julgue satisfatório, procedendo então com a importação de fato.
Caso o usuário não tenha experiência com manipulação de dados, há recursos na
ferramenta para auxiliá-lo, descrevendo o processo de importação e fornecendo
exemplos de separadores de linha e coluna mais freqüentes.
Para arquivos XML, a ferramenta automaticamente efetua a transformação
das tags em linhas e colunas. A tag raiz é ignorada, sendo a tag imediatamente
descendente interpretada como um registro novo, e as demais tags descendentes
desta, incluindo seus respectivos atributos, são interpretadas como colunas. A Figura
4 apresenta um exemplo de XML.
<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tylor</ARTIST>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
</CATALOG>
Figura 4: Exemplo de XML (Catálogo de CDs).
38
No exemplo da Figura 4, a tag a ser ignorada é <CATALOG>, pois é a tag
raiz. A tag imediatamente descendente, <CD>, é tratada como o início de um
registro. As demais tags descendentes (<TITLE>, <ARTIST>, <COMPANY>,
<PRICE>, <YEAR>) são tratadas como as colunas que compõem o registro
corrente. A Tabela 19 mostra o resultado da importação do XML na Figura 4 para
uma tabela.
Tabela 19: Resultado da importação de um arquivo XML.
TITLE
Empire Burlesque
Hide your heart
Greatest Hits
ARTIST
Bob Dylan
Bonnie Tylor
Dolly Parton
COMPANY
Columbia
CBS Records
RCA
PRICE YEAR
10.90 1985
9.90
1988
9.90
1982
Inicialmente, os campos da tabela de destino são definidos como literais,
especificamente do tipo texto, uma vez que o tamanho e o tipo dos dados ainda são
desconhecidos neste passo. No módulo seguinte, de pré-processamento, estes
campos são analisados e definidos de forma mais adequada.
A Figura 5 apresenta a tela deste modulo, com a pré-visualização da
importação de dados em um domínio de ligações telefônicas. O arquivo texto que
contém os dados separa os campos com o caractere “;” (ponto e vírgula), e as linhas
pelos caracteres consecutivos “\r\n” (retorno de carro e linha nova).
39
Figura 5: Tela do módulo de Importação.
Após a importação, os nomes dos campos são carregados em uma tabela
auxiliar, que é utilizada na montagem dinâmica de vários comandos SQL utilizados
pela ferramenta.
À esquerda, o usuário pode navegar pelas tabelas normalizadas do projeto
corrente ou de projetos anteriores. O usuário não pode alterá-las diretamente, mas
pode ver uma amostra dos dados de cada uma delas.
4.3.2 Módulo de Pré-Processamento
Este módulo transforma os tipos dos campos da tabela, inicialmente do tipo
texto, para tipos mais adequados aos dados observados. O usuário define, para
cada campo, o novo tipo, dentre os tipos apresentados pela ferramenta, que são os
seguintes:
40
• Literal: Materializado como varchar(n), onde n é o tamanho do maior valor
do campo;
• Inteiro: Materializado como tinyint, smallint, mediumint, integeger ou bigint,
de acordo com o valor máximo do campo;
• Real: Materializado como float;
• Booleano: Materializado como boolean.
Para optar com mais segurança por um tipo diferente do sugerido, o usuário
pode observar uma amostra dos dados de cada campo, além de ser impedido de
escolher tipos cuja transformação possa causar perda de informação, como
transformar literais em inteiros, que resulta na anulação dos valores do campo.
Para sugerir o tipo mais adequado para cada campo, este módulo investiga os
dados armazenados em cada um deles, extraindo informações como tamanho
máximo e mínimo, valores distintos, além de verificar se é número inteiro ou real. As
regras de sugestão são as seguintes:
• Se tiver apenas 2 valores distintos, sugere Booleano;
• Se for número inteiro, sugere Inteiro;
• Se for número real, sugere Real;
• Caso contrário, sugere Literal.
Todos os testes estão encapsulados em uma stored procedure, cuja função é
inferir o tipo de um dado campo através das análises de seus valores, como recém
explicado. A maior parte desses comandos é montada dinamicamente, com base
nas informações coletadas ao fim da etapa de importação, uma vez que os campos
têm nomes desconhecidos.
41
Além do ajuste fino em cada campo, o usuário ainda pode excluir colunas e
linhas que apresentem dados irrelevantes, corrompidos, inválidos, ou outra
característica em particular que os façam descartáveis.
A Figura 6 apresenta a tela deste modulo durante a importação de um arquivo
de dados de ligações telefônicas. A primeira coluna contém os nomes dos campos
do arquivo, a segunda sugere um novo tipo para o campo, a terceira oferece a opção
de renomear o campo e a última oferece a opção de selecionar um tipo de dado
diferente do sugerido pela ferramenta. Na parte inferior da tela, os botões que
comandam o início da análise, a inspeção de valores, a exclusão de campos e a
aplicação dos ajustes efetuados.
Figura 6: Tela do módulo de Pré-Processamento.
42
4.3.3 Módulo de Eleição de Chave Primária
A aplicação das formas normais em uma tabela exige a existência de uma
chave primária. Ao contrário de um projeto top-down, onde se recorre ao domínio
dos dados de uma entidade para eleger sua chave primária, projetos bottom-up
precisam “descobrir” a chave primária de cada tabela através da análise dos próprios
dados. Este módulo auxilia o usuário nesta tarefa, analisando os dados e calculando
o potencial de cada campo, ou combinação de campos, para ser a chave primária, e
apresenta os resultados ao usuário.
Este potencial é obtido dividindo-se o número de valores distintos do campo
pelo número total de registros da tabela, variando de 0% a 100%. Em uma tabela
com 100 registros, por exemplo, um campo com 100 valores distintos tem um
potencial de 100%, uma vez que cada valor desse campo identifica unicamente cada
registro da tabela, podendo ser eleito como chave primária sem perda de
informação. Em contrapartida, um campo com 70 valores distintos tem potencial de
70%, o que significa que este campo tem valores duplicados, e não pode ser eleito
como chave primária sem perda de registros.
No caso de potenciais inferiores a 100%, ainda há que se considerar a
presença de erros no cadastro dos dados, que podem impedir a identificação da
chave primária. Para que o usuário tenha certeza de que o potencial de um dado
campo, ou de uma combinação de campos, não foi prejudicado por erros nos dados,
a ferramenta oferece uma amostra dos registros que se repetem, impedindo-o(s) de
alcançar um potencial de 100%. Esta funcionalidade é útil para detectar registros
integralmente duplicados, valores corrompidos, nulos, inválidos ou, ainda, explorar o
comportamento dos outros campos em relação ao campo em questão.
43
O módulo apresenta, inicialmente, uma lista com os potenciais dos conjuntos
formados por um ou dois campos. Teoricamente, apenas conjuntos com potencial
igual a 100% poderiam ser selecionados, uma vez que chaves primárias não
aceitam valores repetidos. No entanto, a ferramenta permite selecionar conjuntos
com potencial inferior a 100%, desde que o usuário aceite que a ferramenta descarte
todos os registros onde aquele conjunto se repete. Logo, quanto maior o potencial
apresentado por um conjunto de um ou mais campos, menor a perda de registros
após a eleição da chave primária.
Ao término da eleição, a ferramenta define o(s) campo(s) como chave
primária diretamente na tabela original. Se o usuário optar por campo(s) de potencial
inferior a 100%, a ferramenta cria uma tabela secundária, define a chave primária
nessa nova tabela, carrega os dados da tabela original ignorando os duplicados e,
ao término, informa quantos registros foram inseridos e ignorados.
É possível solicitar o cálculo do potencial para conjuntos de três ou mais
campos, se necessário. O usuário pode, ainda, rejeitar as chaves candidatas
apresentadas e optar por uma chave primária artificial. Nesta última opção, a
ferramenta adiciona à tabela um novo campo, chamado ID, do tipo inteiro, autoincremental, não nulo, e o elege como chave primária.
A Figura 7 apresenta a tela deste modulo.
44
Figura 7: Tela do módulo de Eleição da Chave Primária.
4.3.4 Módulo da 1FN
O módulo da 1FN auxilia o usuário na eliminação de anomalias nos dados
como campos multivalorados e tabelas aninhadas, para que a tabela fique em
conformidade com a 1FN. A ferramenta aplica uma varredura nos dados carregados,
a procura de valores não atômicos, isto é, que representem dois ou mais valores. A
busca tem como foco caracteres freqüentemente utilizados para separar valores em
arquivos de dados, como “,” (vírgula), “;” (ponto e vírgula), tabulação, “ ” (espaço), “|”
(pipe), ou outros caracteres de escolha do usuário. A tabela 20 apresenta um caso
de campo multivalorado.
45
Tabela 20: Exemplo de campo multivalorado.
ID
1
2
3
4
5
6
7
ENVIO DE MENSAGENS
TEXTO
DESTINO
STATUS
Olá
4898765432
OK|ENVIANDO
Pronto
4734245698
ERRO|ENVIANDO
Sistema OK
1134982345
SEM CRÉDITO
Consulta às 08:00 4133578900 RECUSADA|ENVIANDO
To saindo agora
6435465768
SEM OPERADORA
Vamos ao cinema? 5124358907
OK|ERRO|ENVIANDO
Vou me atrasar!
4827849506
EXPIRADA
LOG
03/10/2007
05/10/2007
05/10/2007
06/10/2007
09/10/2007
13/10/2007
17/10/2007
Na Tabela 20 o campo STATUS armazena uma série de valores, separados
por “|” (pipe), representando um histórico de todos os status pelos quais cada
mensagem passou. Este tipo de campo leva a uma análise de dependências
funcionais equivocada, comprometendo o resultado da normalização. Ao detectar um
campo multivalorado, o usuário tem as seguintes opções:
• Gerar um novo registro para cada valor aninhado, repetindo os demais
campos;
• Gerar novas colunas para cada valor aninhado (serão geradas tantas
colunas quantos forem os valores aninhados);
• Remover os valores aninhados excedentes, deixando apenas um
(arbitrariamente o primeiro);
• Ignorar o aninhamento, caso o campo não seja de fato multivalorado ou o
usuário o julgue irrelevante.
As tabelas 21, 22 e 23, a seguir, apresentam o resultado gerado para cada
uma das opções supracitadas.
46
Tabela 21: Transformação de campo multivalorado em novas linhas.
ID
1
1
2
2
3
4
4
5
6
6
6
7
ENVIO DE MENSAGENS
TEXTO
DESTINO
STATUS
Olá
4898765432
OK
Olá
4898765432
ENVIANDO
Pronto
4734245698
ERRO
Pronto
4734245698
ENVIANDO
Sistema OK
1134982345
SEM CRÉDITO
Consulta às 08:00 4133578900
RECUSADA
Consulta às 08:00 4133578900
ENVIANDO
To saindo agora
6435465768
SEM OPERADORA
Vamos ao cinema? 5124358907
OK
Vamos ao cinema? 5124358907
ERRO
Vamos ao cinema? 5124358907
ENVIANDO
Vou me atrasar!
4827849506
EXPIRADA
LOG
03/10/2007
03/10/2007
05/10/2007
05/10/2007
05/10/2007
06/10/2007
06/10/2007
09/10/2007
13/10/2007
13/10/2007
13/10/2007
17/10/2007
Tabela 22: Transformação de campo multivalorado em novas colunas.
ID
TEXTO
1
Olá
2
Pronto
3 Sistema OK
4 Consulta...
5 To saindo...
6 Vamos ao...
7
Vou me...
DESTINO
4898765432
4734245698
1134982345
4133578900
6435465768
5124358907
4827849506
STATUS1
OK
ERRO
S/ CRÉDITO
RECUSADA
S/ ROTA
OK
EXPIRADA
STATUS2 STATUS3
LOG
ENVIANDO
03/10/2007
ENVIANDO
05/10/2007
05/10/2007
ENVIANDO
06/10/2007
09/10/2007
ENVIANDO
ERRO
13/10/2007
17/10/2007
Tabela 23: Transformação de campo multivalorado em valor único.
ID
1
2
3
4
5
6
7
TEXTO
Olá
Pronto
Sistema OK
Consulta às 08:00
To saindo agora
Vamos ao cinema?
Vou me atrasar!
ENVIO DE MENSAGENS
DESTINO
STATUS
4898765432
OK
4734245698
ERRO
1134982345
SEM CRÉDITO
4133578900
RECUSADA
6435465768
SEM OPERADORA
5124358907
OK
4827849506
EXPIRADA
LOG
03/10/2007
05/10/2007
05/10/2007
06/10/2007
09/10/2007
13/10/2007
17/10/2007
A quarta opção simplesmente ignora o campo multivalorado, e o usuário é
informado a respeito das conseqüências decorrentes dessa escolha. A ausência de
campos multivalorados indica que a tabela está de acordo com a 1FN e, portanto,
47
em condições de ser submetida à aplicação da 2FN. A Figura 8 apresenta a tela
deste módulo.
Figura 8: Tela do módulo da 1FN.
Esta tela mostra a aplicação da 1FN sobre dados de teste. A primeira coluna
lista os campos, a segunda mostra a freqüência de aninhamentos detectada em
cada campo, a terceira mostra o caractere usado para separar os valores e a última
oferece a lista de ações possíveis para eliminar os aninhamentos.
4.3.5 Módulo da 2FN
O módulo da 2FN auxilia o usuário na aplicação desta forma normal,
detectando automaticamente as dependências funcionais parciais existentes nos
dados e guiando-o através da remoção de cada uma delas. Após a extração de cada
dependência funcional, as tabelas resultantes são apresentadas ao usuário,
48
situando-o no processo através de seu progresso. O módulo da 3FN só se torna
disponível quando não houver mais dependências funcionais parciais, o que significa
que a 2FN foi aplicada corretamente.
O escopo de uma dependência funcional, como explicado anteriormente,
compreende o conjunto formado por todos os registros de uma tabela, e não apenas
parte deles. Logo, para que A B exista, é necessário que todos os valores de A
consigam determinar seu valor em B, ou seja, uma dada dependência funcional não
possui um nível ou intensidade na qual ocorre. Ela simplesmente existe ou não.
No entanto, para evitar que erros nos dados possam prejudicar a identificação
de dependências funcionais, a ferramenta relaxa essas definições, associando um
nível a cada dependência funcional. Dessa forma, a ferramenta analisa o
relacionamento entre campos e registra a freqüência em que um determina o outro,
gerando um índice para o nível da dependência funcional entre eles. Esse indicador
varia de 0% a 100%, onde 0% indica que um campo não determina o outro em
nenhum de seus valores, e 100% indica que sempre determina, o que corresponde à
tradicional dependência funcional.
Para compreender melhor o funcionamento do mecanismo supracitado, tomese como exemplo uma tabela T(a,b,c,d,e), onde os campos sublinhados compõem a
chave
primária.
Dependências
funcionais
parciais
são
especializações
de
dependências funcionais, pois os campos determinantes fazem parte da chave
primária, e os campos dependentes são campos não chave.
Para gerar os possíveis determinantes, basta aplicar sucessivas combinações
simples entre os componentes da chave, incrementando, a cada iteração, o número
de colunas tomadas concomitantemente, até que a combinação gerada seja a
própria chave primária. Dessa forma, a primeira iteração gera a, b, c, a segunda gera
49
ab, ac, bc, e a terceira gera abc, que é a própria chave, sinalizando o fim das
iterações.
Quanto aos dependentes, basta tomá-los individualmente dos campos não
chave e os combinar com os grupos de determinantes gerados anteriormente. Neste
exemplo, as dependências funcionais a serem testadas são: a d, a e, b d, b
e, c d, c e, ab d, ab e, ac d, ac e, bc d, bc e. Não é
necessário testar se abc d ou abc e ocorrem, pois abc é a própria chave
primária, motivo pelo qual o algoritmo finaliza a geração de combinações no
momento em que o conjunto formado é a própria chave primária. O nível de cada
dependência funcional testada é armazenado em uma tabela auxiliar, que serve de
apoio à etapa de remoção de dependências funcionais.
Dependendo do número de campos e de registros na tabela, o tempo
necessário para efetuar esses testes pode se tornar proibitivo. Para reduzir este
efeito e otimizar o algoritmo, antes de testar cada dependência funcional pela análise
dos próprios dados, a ferramenta lança mão da teoria da cobertura canônica, e tenta
inferir o resultado do teste analisando as dependências funcionais encontradas até o
momento. Se o nível da dependência funcional a ser testada puder ser derivado dos
resultados já armazenados, esta é dispensada de ter seus dados analisados.
A Tabela 24 apresenta um exemplo de análise de dependência funcional,
onde ocorre NOME SIGLA. Na prática, significa que é possível deduzir o valor de
SIGLA para qualquer valor de NOME, com total segurança. O SQL 1 mostra o
comando capaz de detectar este tipo de relacionamento.
50
Tabela 24: Exemplo geral de dependência funcional.
SIGLAS
NOME
ACRE
AUTORIDADES CERTIFICADORAS
CONSELHO REGIONAL DE FARMACIA
CONSELHO REG. DE FARMACIA
GAS LIQUEFEITO PETROLEO
GAS NATURAL VEICULAR
IMPOSTO DE RENDA
RELACAO ANUAL DE INFORMACOES SOCIAIS
SIGLA
AC
AC
CRF
CRF
GLP
GNV
IR
RAIS
select floor( sum( is_unique ) / count(*) * 100 )
from
(
select count( distinct SIGLA ) = 1 as is_unique
from SIGLAS
group by NOME
) as temp
SQL 1: Mensuração do relacionamento entre dois campos.
O select interno, também chamado subselect, pega cada um dos valores
distintos de NOME e verifica com quantos valores distintos de SIGLA ele se
relaciona, retornando 1 se for apenas um, ou 0, se forem mais de 1. O resultado é
uma tabela temporária de apenas uma coluna, de valores 0 e 1, com tantos registros
quanto forem os valores distintos de NOME. Neste exemplo, como todo valor de
NOME está relacionado com apenas um valor em SIGLA, o subselect gera uma
tabela temporária com 8 registros, todos com o valor 1.
O select externo soma todos os valores da tabela, cujo resultado equivale ao
número de valores iguais a 1, divide pelo número total de valores da tabela
temporária e multiplica por 100, para gerar o resultado em forma de porcentagem.
Neste exemplo, a soma dos registros é igual a 8, assim como o número de registros.
Logo, o resultado da divisão é 1, que multiplicado por 100 resulta em 100, indicando
51
que NOME SIGLA em 100% dos casos, ou seja, todos os valores de NOME se
relacionam com apenas um valor de SIGLA.
A aplicação do algoritmo em SQL 1, para verificar a relação SIGLA e NOME
(inversa), gera um resultado diferente. O subselect gerará uma tabela temporária
com 6 registros, uma vez que há 6 valores distintos para SIGLA, dos quais apenas 4
terão valor igual a 1, já que há mais de um valor de NOME para os outros 2, ficando
estes com o valor 0. Quando o select externo fizer a soma, o resultado será 4, que
dividido pelo número total de registros da tabela temporária, que é 6, resultará em
0,66. Após a multiplicação por 100 e a aplicação da função floor(), que arredonda
para baixo, o resultado será 66%, indicando que SIGLA NOME para 66% de seus
valores, não sendo possível inferir a dependência funcional entre esses dois campos
para toda tabela.
Após o término deste processo, a ferramenta apresenta a lista de
dependências funcionais testadas e seus respectivos níveis, calculados pelo
algoritmo em SQL 1. A Tabela 25 apresenta o resultado dessa análise.
Tabela 25: Resultado da análise de relacionamentos.
RELACIONAMENTOS
NOME SIGLA
SIGLA NOME
DEPENDÊNCIA FUNCIONAL
100%
66%
Em caso de dúvidas a respeito do nível de alguma dependência funcional, a
ferramenta oferece uma amostra dos registros onde a mesma foi ferida, para
descobrir se o nível aferido é reflexo de erros ou características naturais dos dados.
Ao analisar os registros onde SIGLA NOME não aconteceu, observa-se que os
valores de SIGLA “AC” e “CRF” têm relação com 2 valores em NOME, cada um.
Para “CRF”, os 2 valores de NOME significam a mesma coisa, sendo distintos entre
52
si apenas pela grafia. Variações dessa sorte são um exemplo clássico de anomalia
nos dados capaz de camuflar características importantes como uma dependência
funcional. No caso de “AC”, os 2 valores de NOME refletem possivelmente uma
característica natural dos dados, cabendo ao usuário descobrir a veracidade da
informação, ou qual dos valores é mais adequado ao domínio dos dados. A Tabela
26 apresenta as exceções da dependência funcional SIGLA NOME.
Tabela 26: Exceções da dependência funcional SIGLA NOME.
SIGLA
AC
CRF
EXCEÇÕES
NOME
ACRE
AUTORIDADES CERTIFICADORAS
CONSELHO REGIONAL DE FARMACIA
CONSELHO REG. DE FARMACIA
Neste ponto, o usuário remove as dependências funcionais de nível igual a
100% e analisa amostras das que tem nível inferior a 100%, decidindo pela remoção
em caso de erro. A cada dependência funcional removida, as tabelas resultantes são
apresentadas ao usuário. Após a remoção de todas as dependências funcionais, o
usuário adquire acesso ao módulo da 3FN. A Figura 9 apresenta a tela deste
módulo.
53
Figura 9: Tela do módulo da 2FN.
4.3.6 Módulo da 3FN
Semelhante ao módulo da 2FN, este módulo auxilia o usuário na aplicação da
3FN, exceto pelo fato de que a dependência funcional procurada é a indireta, isto é,
entre atributos que não fazem parte da chave primária.
A geração dos possíveis determinantes é efetuada da mesma forma descrita
no módulo da 2FN, com a diferença que os campos que formam tanto os
determinantes quanto os dependentes são escolhidos dentre os campos que não
fazem parte da chave primária. Na tabela T(a,b,c,d,e,f), a geração sucessiva de
combinações simples para formar os determinantes gera d, e, f, de, df, ef, def, e a
aplicação do mesmo processo para formar os dependentes gera d, e, f. Dessa
forma, as dependências funcionais a serem testadas, geradas pela combinação
entre os determinantes e os dependentes, são d d, e d, f d, de d, df d,
ef d, def d, d e, e e, f e, de e, df e, ef e, def e, d f, e 54
f, f f, de f, df f, ef f, def f. Não há necessidade de se testar
dependências
funcionais
onde
o
dependente
está
presente
também
no
determinante, motivo pelo qual é feita uma filtragem nas combinações geradas,
removendo todos os elementos nessas condições. Assim, após a aplicação desse
filtro, as dependências funcionais a serem testadas se resumem a e d, f d, ef
d, d e, f e, df e, d f, e f, de f.
No passo seguinte, a ferramenta percorre as dependências funcionais
geradas e vai medindo a freqüência em que ocorrem, utilizando o mesmo processo
aplicado pelo módulo da 2FN. Em seguida, o usuário remove as dependências
funcionais de nível igual a 100% e analisa amostras das que tem nível inferior a
100%, decidindo pela remoção das mesmas caso observe que a dependência
funcional não atingiu freqüência igual a 100% em virtude de erros nos dados. A cada
dependência funcional removida, as tabelas resultantes são apresentadas ao
usuário. Após a remoção de todas as dependências funcionais, o usuário adquire
acesso ao módulo de relatórios. A Figura 10 apresenta a tela deste módulo.
55
Figura 10: Tela do módulo da 3FN.
56
5
CONCLUSÃO
O processo de normalização de tabelas, em virtude da carga de
conhecimento teórico e intimidade com o domínio dos dados exigidos do projetista,
pode se tornar complexo e pouco eficiente, caso não se disponha de um profissional
adequadamente qualificado. Além disso, quando se parte de tabelas já populadas,
como no caso de projetos bottom-up de bancos de dados, há outros fatores
agravantes, como a qualidade dos dados, que pode impedir que dependências
funcionais sejam descobertas, comprometendo todo o andamento do projeto. O
mesmo problema ocorre quando se deseja normalizar documentos de dados
legados, como arquivos XML ou arquivos texto estruturados.
O objetivo deste trabalho foi desenvolver uma ferramenta de apoio a este
processo, capaz de reduzir o conhecimento necessário sobre normalização e
aproximar o usuário do domínio dos dados. A princípio, um algoritmo capaz de varrer
os dados em busca de dependências funcionais, utilizando uma abordagem
resistente a dados de má qualidade, seria suficiente. Contudo, a ferramenta
rapidamente se mostrou muito mais complexa que isso. Para otimizar o desempenho
das análises, é preciso um processamento preliminar dos dados, o que exigiu o
desenvolvimento de um módulo de pré-processamento. As regras que compõem a
normalização giram em torno de uma chave primária, que não pode ser definida
arbritariamente, no caso de uma tabela populada. Isto exigiu o desenvolvimento de
um módulo capaz de auxiliar o usuário a compor a chave primária da forma mais
adequada possível: o módulo de eleição da chave primária. Por obedecerem a uma
ordem de aplicação e estarem baseadas em um tipo específico de restrição a ser
descoberta e eliminada, as formas normais também foram separadas em módulos.
57
Ao término do processo, tornou-se evidente a necessidade de apresentar ao usuário
o resultado da normalização aplicada e os benefícios desta técnica, como a
diminuição no espaço ocupado pelos dados, que foi implementado em um último
módulo.
A principal contribuição deste trabalho está nos algoritmos capazes de
detectar dependências funcionais em tabelas, sem que erros nos dados das
mesmas comprometam o resultado da detecção. Esta ferramenta pode tornar mais
freqüênte o processo de normalização de tabelas, tendo em vista que grande parte
da teoria presente na literatura de banco de dados está embutida na ferramenta,
cabendo ao usuário apenas avaliar os cenários oferecidos pela ferramenta e decidir
a ação a ser tomada. No âmbito acadêmico, esta ferramenta pode ser empregada
em disciplinas de bancos de dados, especialmente aulas sobre normalização de
tabelas, oferecendo aos alunos uma visão mais prática e concreta sobre formas
normais e dependências funcionais. Através da execução da normalização completa
de um arquivo de dados, o aluno pode perceber os benefícios dessa técnica de
forma mais clara e objetiva.
Testes feitos com a ferramenta, utilizando arquivos de dados de diversos
domínios, geraram resultados similares à aplicação da técnica de forma tradicional.
No entanto, apesar de toda a automatização que a ferramenta oferece, algumas
etapas da normalização são de natureza altamente intelectual e dependem de um
projetista que tenha certa intimidade com o domínio dos dados.
A ferramenta desenvolvida durante o curso deste trabalho ainda se apresenta
de forma primitiva, podendo ser extendida para detectar dependências funcionais
mais complexas, como as que foram descritas no capítulo da fundamentação
teórica, cobrindo assim outras formas normais. Além disso, pode ser integrada a
58
ambientes de desenvolvimento de projetos e manipulação de bancos de dados, já
que estes não oferecem nenhuma solução para a etapa de normalização. Ainda que
desenvolvida em java, o que permite a utilização em qualquer plataforma, a
ferramenta pode se tornar ainda mais versátil com uma interface web, pela alta
disponibilidade que este ambiente oferece.
59
BIBLIOGRAFIA
[1]
Codd, E. F. 1970. A relational model of data for large shared data banks.
Commun.
ACM
13,
6
(Jun.
1970),
377-387.
DOI=http://doi.acm.org/10.1145/362384.362685.
[2]
Heuser, C.A. Projeto de Banco de Dados. 5a edição. Série Livros Didáticos –
Instituto de Informática da UFRGS, número 4. Editora Sagra-Luzzatto, 2004.
[3]
Soutou, C. 1998. Relational database reverse engineering: algorithms to extract
cardinality constraints. Data Knowl. Eng. 28, 2 (Nov. 1998), 161-207.
DOI=http://dx.doi.org/10.1016/S0169-023X(98)00017-2
[4]
Korth, H. F.; Sudarshan, S; Silberschatz, A. Sistema de Banco de Dados. 5a
edição. Editora Campus, 2006.
[5]
D. Bitton, J. Millman, S. Torgersen, A feasibility and performance study of
dependency inference. In: Proc. 5th Int. Conf. on Data Engineering (Feb. 1989)
pp. 635-641.
[6]
M. Castellanos, F. Saltor, Extraction of data dependencies. In: Report LSI-93-2R, University of Catalonia, Barcelona (1993).
[7]
M. Castellanos, A methodology for semantically enriching interoperable
databases. In: Proc. llth British National Conf. on Databases (1993) pp. 58-75.
[8]
R. Chiang, T. Barron, V.C. Storey, Performance evaluation of reverse
engineering relational databases into extended entity-relationship models. In:
Proc. 12th Int. Conf. on Entity-Relationship Approach (1993) pp. 402-413.
[9]
Chen, T. X., Liu, S. S., Meyer, M. D., and Gotterbarn, D. 2007. An introduction to
functional independency in relational database normalization. In Proceedings of
the 45th Annual Southeast Regional Conference (Winston-Salem, North
60
Carolina, March 23 - 24, 2007). ACM-SE 45. ACM Press, New York, NY, 221225. DOI= http://doi.acm.org/10.1145/1233341.1233381.
[10] Yeh, D. and Li, Y. 2005. Extracting Entity Relationship Diagram from a TableBased Legacy Database. In Proceedings of the Ninth European Conference on
Software Maintenance and Reengineering (March 21 - 23, 2005). CSMR. IEEE
Computer
Society,
Washington,
DC,
72-79.
DOI=
http://dx.doi.org/10.1109/CSMR.2005.31.
[11] Chen, P. P. 1976. The entity-relationship model—toward a unified view of data.
ACM
Trans.
Database
Syst.
1,
1
(Mar.
1976),
9-36.
DOI=
http://doi.acm.org/10.1145/320434.320440.
[12] Ramakrishnan, R., Gehrke, J. Database Management Systems.3th ed. McGraw
Hill. 2003.
[13] Date, C. J. Introdução a Sistemas de Bancos de Dados. 8a edição. Editora
Campus, 2004.
[14] S. Jarzabek, Tan Poh Keam, "Design of a generic reverse engineering assistant
tool," wcre, p. 61, Second Working Conference on Reverse Engineering, 1995.
[15] Antonija Mitrovic, "NORMIT: A Web-Enabled Tutor for Database Normalization,"
icce, p. 1276, 2002 International Conference on Computers in Education
(ICCE'02), 2002.
[16] Computer Associates. ERWin. Disponível em: <http://www.ca.com>. Acesso em
14 out. 2007.
[17] Embarcadero . ER Studio. Disponível em: <http://www.embarcadero.com>.
Acesso em 14 out. 2007.
[18] fabFORCE . DB Designer. Disponível em: <http://fabforce.net>. Acesso em 14
out. 2007.
61
[19] Quest Software. Toad Data Modeler. Disponível em: <http://www.quest.com>.
Acesso em 14 out. 2007.
62
Download