Prova de Fundamentos de Bancos de Dados 1a Prova Prof. Carlos A. Heuser Setembro de 2007 Prova sem consulta – duas horas de duração 1. (Peso 2,5) Uma companhia de aviação deseja montar uma base de dados para divulgação em um site Web. A base de dados deve conter as seguintes informações. A companhia oferece vários vôos. Cada vôo é identificado por um código numérico e a base de dados deve registrar o tipo de aeronave que é usada para o vôo. Cada aeronave é identificada por uma sigla alfa-numérica, como "B-767"e possui uma descrição. Obviamente, um tipo de aeronave pode ser usado em muitos vôos. Além dos dados acima, é necessário saber os trechos que compõe o vôo. Um vôo é composto de vários trechos, numerados de um em diante, na ordem em que são voados. Para cada trecho é necessário saber o horário de saída, o horário de chegada, o aeroporto de origem e o aeroporto de destino. Um aeroporto é identificado por uma sigla de três letras, como "POA"ou "RIO"e tem um nome. Projete uma base de dados relacional que armazene os dados acima sem redundância de dados. Enumere as tabelas, suas colunas, as chaves primárias e a as chaves estrangeiras. Não devem ser criadas colunas artificiais, além das apresentadas no enunciado. Apresente o esquema na notação textual vista em aula. 1 Solução: Voo (CodVoo,SiglaTipoAero) CodTipoAero referencia TipoAeronave TipoAeronave (SiglaTipoAero,DescricaoTipoAero) Trecho (CodVoo,NumTrecho,SiglaAeroSaida,HorarioSaida, SiglaAeroChegada,HorarioChegada) SiglaAeroSaida referencia Aeroporto SiglaAeroChegada referencia Aeroporto CodVoo referencia Voo Aeroporto (SiglaAero,NomeAero) 2 2. A companhia de aviação referida na questão anterior já possui uma base de dados sobre as localidades por ela atendidas. Esta base de dados contém as seguintes tabelas: Aeroporto (SiglaAero, NomeAero) (Tabela com dados dos aeroportos.) Cidade (CodCidade,NomeCidade,CodPais) (CodPais) referencia Pais (Tabela com dados das cidades) Pais (CodPais,NomePais) (Tabela com dados de países) Atendimento (CodCidade,SiglaAero,DistanciaAeroCid) (SiglaAero) referencia Aeroporto (CodCidade) referencia Cidade (Tabela que relaciona as cidades aos aeroportos que as servem e informa a distância em quilômetros da cidade ao aeroporto) Filial (CdoFilial,EnderecoFilial, CodCidade) (CodCidade) referencia Cidade (Tabela com as filiais onde acontece atendimento ao público) Sobre esta base de dados, resolver as consultas que seguem usando álgebra relacional: 3 a) (Peso 1) Um aeroporto está localizado em um país e atende cidades deste país. Entretanto, sabe-se que podem ter ocorrido alterações na base de dados que a levaram a um estado inconsistente quanto a este requisito. Para cada par de cidades de diferentes países e que são atendidas pelo mesmo aeroporto, obter o nome do aeroporto, seguido dos nomes das cidades e respectivos nomes de país. Observar que o mesmo par não deve constar duas vezes. Por exemplo, se no resultado constar (Aeroporto X,Cordoba,Porto Alegre) não deve constar (Aeroporto X,Porto Alegre,Cordoba). π Aeroporto.NomeAero, Cidade1.NomeCidade, Pais1.NomePais, Cidade2.NomeCidade, Pais2.NomePais ( σ Pais1.CodPais=Cidade1.CodPais AND Cidade1.CodCidade=Atendimento1.CodCidade AND Atendimento1.SiglaAero=Aeroporto.SiglaAero AND Pais2.CodPais=Cidade2.CodPais AND Cidade2.CodCidade=Atendimento2.CodCidade AND Atendimento2.SiglaAero=Aeroporto.SiglaAero Pais1.CodPais<Pais2.CodPais ( ρ Pais1 (Pais) × ρ Cidade1 (Cidade) × ρ Atendimento1 (Atendimento) × ρ Pais2 (Pais) × ρ Cidade2 (Cidade) × ρ Atendimento2 (Atendimento) × Aeroporto ) ) ou 4 π Aeroporto.NomeAero, Cidade1.NomeCidade, Pais1.NomePais, Cidade2.NomeCidade, Pais2.NomePais ( σ Pais1.CodPais=Cidade1.CodPais AND Cidade1.CodCidade=Atendimento1.CodCidade AND Atendimento1.SiglaAero=Aeroporto.SiglaAero AND Pais2.CodPais=Cidade2.CodPais AND Cidade2.CodCidade=Atendimento2.CodCidade AND Atendimento2.SiglaAero=Aeroporto.SiglaAero Pais1.CodPais<Pais2.CodPais ( (ρ Pais1 (Pais) 1 ρ Cidade1 (Cidade) 1 ρ Atendimento1 (Atendimento) 1 ) 1 (Atendimento2.SiglaAero= Atendimento1.SiglaAero AND Cidade1.CodCidade< Cidade2.CodCidade ) (ρ Pais2 (Pais) 1 ρ Cidade2 (Cidade) 1 ρ Atendimento2 (Atendimento) 1 ) 1 (Atendimento1.SiglaAero)(SiglaAero) Aeroporto ) ) 5 b) (Peso 1,5) Para cada filial localizada em uma cidade atendida pelo aeroporto de sigla "YYC"e que fica a menos de 20 Km do aeroporto, obter o endereço da filial. i. Resolver usando produto cartesiano. π EnderecoFilial (σ Atendimento.CodCidade=Filial.CodCidade AND Atendimento.SiglaAero=‘‘YYC’’ AND Atendimento.DistanciaAeroCid<20 (Atendimento × Filial ) ii. Resolver usando junções, de preferência junções naturais π EnderecoFilial (σ Atendimento.DistanciaAeroCid<20 Atendimento.SiglaAero=‘‘YYC’’ AND (Atendimento 1 Filial ) 6 c) (Peso 1) Obter os nomes das cidades que não são atendidas por nenhum aeroporto. π NomeCid ( (π CodCid, NomeCid (Cidade) ) − (π CodCid, NomeCid (Cidade 1 Atendimento) ) ) ou π NomeCid ( ((π CodCid (Cidade)) − (π CodCid (Atendimento)) ) 1 Cidade ) ou, ainda, π NomeCid ( σ Atendimento.CodCid IS NULL (Cidade=1 Atendimento)) ) Observar que a consulta abaixo não é bem correta. O que acontece quando duas cidades, uma atendida e outra não, têm o mesmo nome? (π NomeCid (Cidade) ) − (π NomeCid (Cidade 1 Atendimento) ) 7 d) (Peso 1) Por um erro de programação, foram incluídas linhas na tabela Atendimento, relacionando vários aeroportos a todas cidades do país de nome "Brasil". Obter o código e nome de cada aeroporto que está ligado a todas cidades deste país. ( π SiglaAero,NomeAero,CodPais (Atendimento 1 Aeroporto ) ) ÷ ( π CodPais (σ NomePais=’Brasil’ (Pais ) ) ) 8 3. Sobre a base de dados da questão precedente (Questão 2), expresse as seguintes consultas em SQL, sem o uso da sintaxe para junções explícitas, nem sub-consultas (ainda não vistas em aula): a) (Peso 1) Obter os nomes das cidades que não são atendidas por nenhum aeroporto com menos de 20 Km de distância. SELECT NomeCidade FROM (SELECT CodCidade,NomeCidade FROM Cidade ) EXCEPT (SELECT CodCidade,NomeCidade FROM Cidade, Atendimento WHERE Cidade.CodCidade = Atendimento.CodCidade AND DistanciaAeroCid < 20 ) ) b) (Peso 1) Obter o nome de cada aeroporto que existe no país de nome "Brasil". SELECT NomeAero FROM Aeroporto, Atendimento, Cidade, Pais WHERE Aeroporto.SigalAero=Atendimento.SiglaAero AND Atendimento.CodCidade=Cidade.CodCidade AND Cidade.CodPais=Pais.CodPais AND NomePais=´Brasil´ 9