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