Bases de Dados 1, Época Normal 2003/04 DI- FCT/UNL 2004.01.16 16 de Janeiro de 2004 Bases de Dados 1 Exame de época normal, 2003/04 Duração: 3 horas (com consulta) Grupo 1 Nota prévia: O enunciado deste grupo é intencionalmente vago. Ao responder deverá, sempre que ache necessário, dizer o que assumiu e que não estava detalhado no enunciado. O Euro’2004 aproxima-se a passos largos. Para se preparar para o evento, um amigo seu decidiu pedir-lhe que implementasse uma pequena base de dados para armazenar informação sobre o evento. Essa base de dados deve permitir armazenar informação referente a: • Todas as equipas participantes incluindo, de cada uma delas, o nome do país, do treinador e informação do plantel com, pelo menos, os nomes dos jogadores e suas idades; • Constituição dos grupos da primeira fase do campeonato; • Todos os jogos da primeira fase incluindo, para cada um, informação das (duas) equipas que o disputarão, data em que terá lugar, nome do estádio onde se realizará, localidade onde se situa e lotação do estádio. A base de dados deve já estar preparada para se virem depois a introduzir os resultados dos vários jogos da primeira fase. 1 a) Esboce um diagrama de entidades e relações para a base de dados. 1 b) Com base nesse diagrama, apresente em SQL os comandos de criação das tabelas que constituem a referida base de dados. Os comandos SQL deverão ter em conta todo o tipo de restrições de integridade relevantes, devendo garantir automaticamente, por exemplo, a integridade de referência. 1 c) Como deverá saber, cada grupo da primeira fase é constituído exactamente por 4 equipas, sendo que cada uma das equipas só pertence a um grupo. É avisado deixar que a base de dados deixe que um grupo possa ter menos que 4 equipas (senão, antes mesmo de introduzir dados a base de dados já estaria inconsistente). Mas não convém nada que a base de dados permita que um grupo tenha mais que 4 equipas. A sua base de dados já garante que um grupo não possa ter mais do que 4 equipas? Se sim, explique como o garante. Se não, explique sucintamente o que teria que fazer para que passasse a garantir? 1 d) Como também deverá saber, na primeira fase do campeonato só pode haver jogos entre equipas dum mesmo grupo. A sua base de dados já garante que um jogo não pode envolver equipas de grupos diferentes? Se sim, explique como o garante. Se não, explique sucintamente o que teria que fazer para que passasse a garantir? 1 e) Para transferir informação relativa aos plantéis e treinadores das várias equipas dava jeito usar documentos XML. Proponha um DTD para ficheiros XML contendo informação sobre várias equipas, respectivos treinadores e jogadores, com informação dos nomes e idades destes últimos. 1 f) Escreva uma expressão XPath que identifique o nome dos jogadores com menos de 20 anos contidos num ficheiro XML que esteja de acordo com a DTD que propôs. Página 1 de 2 DI-FCT/UNL Bases de Dados 1, Época Normal 2003/04 2004.01.16 Grupo 2 Com o tempo foram sendo acrescentadas funcionalidades à base de dados e algumas delas exigiram que se tivesse que guardar, para cada jogador que participasse em cada jogo, o minuto em que esse jogador entrou (que seria 0 no caso do jogador entrar no início do jogo) e o minuto em que saiu. Para guardar essa informação foi definido uma relação com o seguinte esquema: R = {Jogo,Jogador,Equipa,Treinador,Entrada,Saida} 2 a) Sobre este esquema há uma série de condições que importa impôr: “Cada equipa tem no máximo um treinador. Um jogador só pertence a uma equipa. Um jogador que tenha sido substituído não pode voltar a entrar no mesmo jogo (ou seja, em cada jogo um jogador no máximo só pode entrar uma vez, e no máximo só pode sair uma vez)”. Apresente um conjunto de dependências funcionais que imponha estas restrições. 2 b) Decomponha o esquema R, sem perdas, por forma a obter um conjunto de esquemas que, face às dependências funcionais da alínea anterior, esteja na forma normal de Boyce-Codd. Grupo 3 Considere o seguinte esquema duma base de dados relacional para armazenar informação sobre jogos dum campeonato de futebol (onde os atributos chave se encontram sublinhados): jogos({NumJogo,Data,Equipa1,Equipa2}) golos({NumJogo,CodJog,Minuto,Auto}) jogadores({CodJog,Nome,NomeEq}) jogaram({CodJog,NumJogo,Desde,Até}) Assim, cada jogo tem um número único, uma data e os nomes das duas equipas que se defrontaram; cada jogador têm um código único, um nome e a indicação da equipa em que joga; cada golo é marcado num jogo, por um jogador num dado minuto do jogo. Há ainda a indicação de se tratar ou não dum auto-golo, armazenada no atributo Booleano Auto. A relação jogaram armazena a informação dos jogadores que jogaram em que jogos, desde que minuto e até que minuto. Apresente o código SQL correspondente a cada uma das expressões das alíneas de a) a d) (pode, sempre que o entender, criar “views” com perguntas intermédias; pode também usar abreviaturas desde que as explicite): 3 a) 3 b) 3 c) 3 d) Quais os jogadores que alinharam de início (i.e. desde o minuto 0) no jogo Portugal-Grécia? Quantos minutos jogou cada um dos jogadores de Portugal ao longo de todo o campeonato? Quantos golos foram marcados por cada uma das equipas? Qual o resultado do Portugal-Grécia? 3 e) Apresente uma expressão em álgebra relacional que corresponda à pergunta: “Quais os jogadores de Portugal que participaram em todos os jogos (de Portugal, claro!)?” 3 f) Apresente uma expressão em Datalog que corresponda à pergunta: “Quais os nomes dos jogadores que não marcaram nenhum golo?” Grupo 4 Com o passar do tempo constatou-se que as perguntas mais frequentes à base de dados do grupo anterior incidiam sobre resultados dos jogos. Para tornar mais eficiente a resposta a esse tipo de perguntas foi decidido adicionar à relação jogos os atributos (redundantes) Golos1 e Golos2, para em cada jogo armazenar quantos golos foram marcados pela Equipa1 e pela Equipa2. Feito isto, para garantir a consistência dos dados nesses atributos houve que fazer duas coisas: 4 a) 4 b) Apresente o código SQL para, imediatamente após a alteração do esquema, preencher correctamente os atributos Golos1 e Golos2 de cada um dos tuplos já existentes em jogos. Assumindo que, após a alteração, a informação sobre os golos marcados em cada jogo continua a ser feita apenas através da relação golos, apresente o código dos “triggers” SQL necessários para manter sempre consistente a informação dos atributos Golos1 e Golos2. Página 2 de 2 DI-FCT/UNL