Anda di halaman 1dari 7

Prova de Fundamentos de Bancos de Dados

1a Prova Prof. Carlos A. Heuser Abril de 2009


Prova sem consulta duas horas de durao 1. (Peso 2) Deseja-se projetar um banco de dados para o stio de uma prefeitura. Neste stio, esto armazenadas informaes sobre a rede de ruas de uma cidade. Para cada rua, o banco de dados deve conter o nome atual da rua, e as coordenadas geogrcas (latitude e longitude) do incio e do m da rua. Cada rua possui um identicador nico. Para algumas ruas que mudaram de nome ao longo de tempo, necessrio saber cada um de seus nomes antigos. Deve ser observada que uma determinada rua pode ter tido vrios nomes no passado. No h limite superior para o nmero de nomes que uma rua teve no passado. Alm de dados das ruas, o banco de dados deve conter dados sobre os cruzamentos entre as ruas. Cada cruzamento tem um identicador nico e situa-se em uma determinada latitude e longitude. Em cada cruzamento, encontram-se vrias ruas. Para cada rua que faz parte do cruzamento necessrio conhecer o nmero, na rua, em que passa o cruzamento. Exemplicando, um cruzamento poderia ser o encontro da rua de nome "Rua do Arvoredo", no nmero 420, com a rua de nome "Avenida do Parque", no nmero 100. Deve ser observado que, em um cruzamento, podem encontrar-se mais que duas ruas (no h limite denido) Projete uma base de dados relacional para armazenar os dados acima sem redundncia de dados. Enumere as tabelas, suas colunas, as chaves primrias e a as chaves estrangeiras. Caso necessrio, podem ser criadas chaves primrias articiais. Apresente o esquema na notao textual ou diagramtica vista em aula. Soluo: rua (rua_id, nome_rua, estensao_rua, lat_inicio, long_incio, lat_fim, long_fim) rua_nome_antigo (rua_id, no_nome, nome_rua) (rua_id) referencia rua cruzamento (cruz_id, lat_cruz, long_cruz) rua_cruzamento (cruz_id,rua_id, nummero_na_rua)

2. Considere a seguinte base de dados, usada por um banco de dados de um software de gerncia de clnicas mdicas. /* tabela de clnicas mdicas */ Clinica(CodCli,NomeCli,LocalCli) /* tabela de mdicos */ Medico(CodMed,NomeMed,CodEspeci) CodEspeci referencia Especialidade /* tabela que relaciona mdicos a clnicas */ ClinicaMedico(CodCli,CodMed) CodCli referencia Clinica, CodMed referencia Medico /* tabela coma agenda das consultas dos mdicos */ AgendaConsulta(CodCodCli,CodMed,Data,Hora) (CodCli,CodMed) referencia ClinicaMedico /* tabela com as especialidades que os mdicos podem ter - para cada especialidade, pode ser indicada uma especialidade mais genrica (por exemplo cirurgia geral pode ser uma especialidade mais genrica que cirurgia peditrica); isto indicado pela coluna CodEspeciGenerica*/ Especialidade(CodEspeci,Nome,CodEspeciGenerica) CodEspeciGenerica referencia Especialidade

Sobre esta base de dados, resolver as consultas que seguem usando lgebra relacional: 2.a (Peso 2) Obter o nome das clnicas que tem mdicos que atuam na especialidade denominada Geriatria. i. Resolver sem usar os operadores explcitos de juno. Soluo: NomeCli ( Clinica.CodCli=ClinicaMedico.CodCli AND ClinicaMedico.CodMed=Medico.CodMed AND Medico.CodEspeci=Especialidade.CodEspeci AND Especialidade.Nome=Geriatria (Clinica ClinicaMedico Medico Especialidade ) ) ii. Resolver usando operadores explcitos de juno. Preferir o uso de juno natural, seno, usar equi-juno e em ltimo caso usar theta-juno. Soluo: Como as junes so por colunas homnimas, d para usar a juno natural. NomeCli ( Especialidade.Nome=Geriatria (((Clinica ClinicaMedico ) Medico ) Especialidade ) )

2.b (Peso 1,2) Obter os cdigos dos mdicos que atuam em todas clnicas cadastradas no banco de dados. Soluo: ( CodCli,CodMed (ClinicaMedico) ) ( CodCli (Clinica) ) 2.c (Peso 1,2) Obter os cdigos e nomes dos mdicos que esto livres no dia 28/04/2009. Estar livre na data signica que, para aquele mdico, no h consulta na agenda nesta data. Soluo: ( CodMed, NomeMed (Medico) ) ( CodMed, NomeMed ( Data=28/04/2009 (Medico AgendaConsulta ) ) )

2.d (Peso 1,2. . . ) Obter uma tabela contendo as seguintes colunas: i. Cdigo e nome de cada clnica; ii. Nome de cada mdico da clnica, que atua na especialidade denominada Obstetrcia. Caso a clnica no tiver mdicos ou, caso ela no tiver nenhum mdico atuando nesta especialidade, o cdigo e o nome da clnica devem aparecer seguidos de vazio. Soluo: ( CodCli, NomeCli, NomeMed (Clinica (ClinicaMedico (Medico (Especialidade.CodEspeci=MedicoCodEspeci AND Especialidade.Nome=Obstetrcia ) Especialidade ) ) ) Observar que a seleo por nome de especialidade no pode ser realizada depois da juno externa, pois desfaz o efeito desta. Observar que, caso a ordem das junes for diferente, pode ser necessrio fazer duas junes naturais: ( CodCli, NomeCli, NomeMed (( (Clinica ClinicaMedio ) Medico ) - (Especialidade.CodEspeci=MedicoCodEspeci AND Especialidade.Nome=Obstetrcia ) Especialidade ) )

2.e (Peso 1,2. . . ) Para cada mdico que atua em duas clnicas diferentes, obter o nome do mdico seguido do nome das clnicas. Se um mdico atua em mais de duas clnicas, todos os pares formados por essas clnicas devem aparecer no resultado. Soluo: ( Medico.NomeMed, Clinica1.NomeCli, Clinica2.NomeCli ( Medico.CodMed=ClinicaMedico1.CodMed AND Medico.CodMed=ClinicaMedico2.CodMed AND ClinicaMedico1.CodCli<>ClinicaMedico2.CodCli AND ClinicaMedico1.CodCli=Clinica1.CodCli AND ClinicaMedico2.CodCli=Clinica2.CodCli AND (Medico ( ClinicaMedico1 (ClinicaMedico)) ( ClinicaMedico2 (ClinicaMedico)) ( Clinica1 (Clinica)) ( Clinica2 (Clinica)) )

3. (Peso 1,2. . . ) Considere a seguinte consulta em SQL: SELECT Medico.NomeMed FROM Medico, ClinicaMedico, Clinica WHERE Medico.CodMed = ClinicaMedico.CodMed AND ClinicaMedico.CodCli = Clinica.CodCli AND Medico.CodEspeci = Ortopedia AND Clinica.NomeCli = ABD Ortopedia Mostre a consulta equivalente em lgebra relacional, depois, mostre a representao da consulta em forma de arvore e aps, mostre cada um dos passos da otimizao algbrica. Soluo: Consulta em lgebra relacional (a ordem dos produtos cartesianos foi arbitrada; outras ordens so equivalente e levam a uma consulta diferente com o mesmo resultado): Medico.NomeMed Medico.CodMed = ClinicaMedico.CodMed AND ClinicaMedico.CodCli = Clinica.CodCli AND Medico.CodEspeci = M AND Clinica.NomeCli = ABD Ortopedia ( Medico (ClinicaMedico Clinica ) ) As rvores no esto apresentadas.

Anda mungkin juga menyukai