Segunda Parte

Propaganda
Base de Dados 2004/05
Enunciado da 2ª Parte do Projecto
Neste projecto pretende-se implementar uma base de dados e uma aplicação para
gerir stocks de uma empresa. O projecto deverá ser realizado pelo mesmo grupo
que efectuou a primeira parte do trabalho.
O projecto será avaliado por dois relatórios que deverão ser entregues em papel
segundo o template disponibilizado no Website da disciplina. Junto com o segundo
relatório deverá ser entregue um CDROM ou disquete com todo o código
desenvolvido pelos alunos.
Para facilitar a correcção, os relatórios deverão ser apenas agrafados. Não utilize
capas rígidas ou transparentes, não encaderne o relatório (com argolas ou a
quente), nem intercale folhas em branco dentro do relatório. Os relatórios e código
devem ser enviados por email para o responsável da cadeira.
O nome dos ficheiros a enviar deve obedecer ao seguinte formato:
númerodogrupoReln.doc (n=1 para o 1º relatório e n= 2 para o 2º relatório) e
númerodogrupoApl.zip (para o código da aplicação da 2ª parte).
Segunda Parte
Nesta segunda parte do projecto os alunos deverão implementar um programa em
Java com JDBC que corresponda a parte de uma aplicação de gestão e comércio
electrónico de livros e CDs e responder a algumas questões. Devem usar a solução
da 1ª parte do projecto publicada na página da cadeira e assumi-la como oficial.
Esta solução oficial da 1ª parte inclui: o diagrama de classes UML, modelo
relacional, restrições de integridade, as instruções SQL para criação das tabelas e
implementação das restrições de integridade e os dados para popular as tabelas.
Estão ainda publicadas as instruções SQL para responder às interrogações da 1ª
parte, embora tal não seja necessário para a 2ª parte.
O programa Java desenvolvido deve obrigatoriamente obedecer a uma interface
Java e utilizar as classes Java bem definidas e publicadas na página da cadeira. O
código desenvolvido irá ser testado com Junit e Dbunit. As interfaces e classes
fornecidas não podem ser modificadas, pois os testes automáticos vão usá-las. Os
alunos que as modificarem sofrem uma penalização de 100%..
A interface gráfica do programa com o utilizador é irrelevante neste projecto e
portanto não será avaliada. Aproveite a oportunidade para optimizar o seu tempo
utilizando uma linha de comando ou ficheiros de configuração.
O segundo relatório deverá ser entregue até 11 de Dezembro e deverá conter, para
além da capa formatada de acordo com o template (da 1ª parte), os seguintes
capítulos:
1. Desenho de Base de Dados Relacional – Responda às questões da Secção 2.1
(Máximo: 1 página.)
2. Suporte Transaccional – Responda às questões da Secção 2.. (Máximo: 1
página.)
1
3. Conclusões – Resuma as principais contribuições deste relatório, destacando o
que aprendeu com o projecto e o que poderia ser feito para melhorar o enunciado.
Enumere sugestões de trabalho futuro, ou seja, o que gostaria de fazer a seguir.
(Máximo: 1 página.)
Anexo – Entregue num envelope fechado (agrafado ao relatório) um CDROM ou
disquete (ou envie por mail juntamente com o relatório) com todo o código
desenvolvido na 2ª parte do projecto. Os nomes dos elementos do grupo devem ser
escritos tanto no envelope como no CDROM/disquete. Se enviado por mail, o nome
do ficheiro que contém o código deve obrigatoriamente obedecer à notação
especificada no ínicio deste enunciado
2.1 Desenho de Base de Dados Relacional
Considere o esquema relacional da solução oficial da 1ª parte. Responda às
seguintes questões, usando o seu conhecimento sobre formas normais:
A. Suponha que o esquema da relação Pessoa passava a ser o seguinte:
PESSOA (ent_id, tipo_pessoa, nome, info_id, local_id)
Diga, justificando, em que forma normal está o esquema da relação Pessoa? Quais
as vantagens e desvantagens deste esquema relativamente ao fornecido com a
solução oficial da 1ª Parte?
B. Considere o esquema da relação:
PRODUTO (prod_id, nome, preco, desconto, iva)
e suponha a seguinte dependência funcional: preço  desconto. Em que forma
normal está a relação PRODUTO? Quais os problemas que daí podem advir?
2.2 Programa Java
Escreva um programa em Java (obedecendo obrigatoriamente à interface e
classes fornecidas) utilizando JDBC e stored procedures (de acordo com o
especificado), que permita implementar as seguintes funcionalidades:
A. Inserir informação pessoal de cliente, isto é: nome, rua, cidade, código postal,
número de telefone, número de fax, e email. Implemente um stored procedure
para esta funcionalidade e invoque-o no seu programa Java através de JDBC.
B. Pesquisar informação de produtos, por tipo (CD ou livro), ou por autor/artista. A
informação sobre os produtos que deve ser apresentada é a seguinte: ISBN
(livro) ou código (disco), nome, preço, IVA, desconto, nome da categoria,
palavras chave (livro), editora (disco), nome do tipo (CD), nome dos autores ou
artistas. Os produtos retornados devem ser ordenados por ordem crescente do
seu identificador. Implemente esta funcionalidade em JDBC e não use um stored
procedure.
C. Comprar produtos indicando o ISBN ou código respectivo e a quantidade. Deve
ser inserida uma factura na base de dados com a informação respectiva e deve
ser retornada a seguinte informação: número factura, data encomenda, total,
método de envio, método de pagamento, número do cartão e data de validade
(se o método de pagamento fôr cartão de crédito), e informação sobre o cliente e
destinatário (se forem distintos). O stock existente de cada produto comprado
deve ser actualizado na base de dados. Se existir mais do que o armazém com
stock disponível para fornecer um determinado produto para uma factura, deve
2
ser escolhido o que tem mais unidades em stock. Implemente esta
funcionalidade em JDBC e não use um stored procedure.
D. Inserir produtos em que os seguintes dados devem ser preenchidos: ISBN (livro)
ou código (disco), nome, preço, IVA, desconto, nome da categoria, palavras
chave (livro), editora (disco), nome do tipo (CD), nome dos autores ou artistas,
informação de contacto e localização do armazém e quantidade disponível do
produto no armazém. Implemente um stored procedure para esta funcionalidade
e invoque-o no seu programa Java através de JDBC.
E. Actualizar stock de um produto para um determinado armazém. Deve ser
especificada a quantidade a incrementar/decrementar, tendo em conta que o
stock não pode ficar negativo. Implemente um stored procedure para esta
funcionalidade e invoque-o no seu programa Java através de JDBC.
F. Listar informação sobre os N melhores clientes. “N” é dado como parâmetro. O
melhor cliente é aquele que efectuou compras em maior valor em no total das
facturas em seu nome. Se existirem dois clientes que tenham gasto o mesmo
montante, ordene-os alfabeticamente pelo seu identificador. Implemente esta
funcionalidade em JDBC e não use um stored procedure.
As interfaces e classes fornecidas encontram-se divididas segundo dois pacotes
(aplicacao e resultados) cujos nomes não podem ser mudados. Todo o código
desenvolvido deve pertencer a um destes pacotes.
A classe que concretiza a interface IAplicacao tem que se chamar
aplicacao.Aplicacao e deve fornecer o constructor sem argumentos (isto é: public
Aplicacao()).
A classe Aplicacao tem que pertencer ao pacote aplicacao.
Tenham em conta que os testes automáticos às funcionalidades do programa
contêm o seguinte código:
import aplicacao.Aplicacao;
import resultados.Pessoa;
...
Aplicacao ap = new Aplicacao();
Pessoa pessoa;
....
ap.iniciaBD(username, passwd, url, driver);
....
ap.insereInfoCliente(pessoa);
....
Os programas que não suportem esta interface que vai ser usada pelos testes serão
penalizados em 100%.
3
2.3 Suporte Transaccional
Observe, na prática, o suporte transaccional do SGBD assim com a recuperação de
falhas e controlo de concorrência.
A. Implemente o seu programa Java de modo a garantir que todas as
funcionalidades especificadas em 2.2 sejam executadas de acordo com as
propriedades ACID. Descreva e comente as decisões tomadas.
B. Para observar a recuperação de falhas, aborte o programa de várias formas
durante a transacção e observe se os resultados parciais são removidos. Por
exemplo, use duas threads, em que uma aborta a outra. Aborte o programa após o
final da transacção e verifique se os dados inseridos são perdidos. Comente e
justifique o que verificou.
C. Para observar o controlo de concorrência simule dois ou mais utilizadores.
Verifique o que acontece ao tentar aceder aos mesmos dados no âmbito de duas
transacções. Utilize threads dentro do mesmo programa, dois programas no mesmo
PC e dois programas em dois PC distintos. Teste o cenário acima descrito com os
seguintes
graus
de
isolamento
e
comente
os
resultados:
TRANSACTION_READ_COMMITTED,
TRANSACTION_READ_UNCOMMITTED,
TRANSACTION_REPEATABLE_READ e TRANSACTION_SERIALIZABLE.
4
Download