1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[AJUDA] - Base dados de um Aeroporto

Discussão em 'Programação' iniciada por jtcgomes, 17 de Janeiro de 2007. (Respostas: 18; Visualizações: 4056)

  1. jtcgomes

    jtcgomes Power Member

    Ora viva malta... então é assim.
    Tenho uma base dados de um aeroporto para fazer para a cadeira de Base de Dados I, e estou a ter algumas dificuldades na realização das tabelas...
    Gostava que lessem o enunciado, e vissem as tabelas que estou a chegar, e me dissessem onde estou a errar.. então cá vai.

    Obrigadão
    As minhas tabelas:
    Código:
    [B] AVIOES:[/B]([U]matricula,[/U] nome de avião, num total horas de voo, marca, modelo, num lugares executivos, num lugares turisticos, [COLOR=Red]num membros tripulação, funçoes tripulantes[/COLOR])
    [B] TRIPULAÇÃO:[/B](Nome chefe cabine, num chefe cabine, num comandante, num co-piloto)
    [B]INSPECÇÕES:[/B](matricula, num inspecçao, data de inicio, data de fim, hora inicio, hora fim, num horas de voo no inicio da insp)
    [B]VOOS:[/B](codigo de vo, cidade partida, cidade destino, hora partida, hora chegada, num milhas voo, num de escalas)
    [B]ESCALA:[/B](cidade de escala, hora da escala)
    [B]EMPREGADOS:[/B]([COLOR=Red]SUPER CLASSE???[/COLOR])(num empregado, nome, apelido, morada, num telefone, data admissão na companhia)
    
    Ora bem, depois deste paleio todo (desculpem por isso), surgem as duvidas...
    A tabela empregados é uma super classe? como relaciono o pessoal de voo e respectivas funções?

    Eu tendo as tabelas feitas, faço os diagramas DERE, e implemento o código em SQL... mas tá dificil lá chegar..

    Depois "posto" aki imagens dos diagramas, para voces verem, e se quiserem, o codigo em SQL inclusivê...
    Agradecia era uma ajudita nas tabelas, pois sem ter certezas, não consigo avançar pra frente...

    mais uma vez, OBRIGADO...
     
  2. jtcgomes

    jtcgomes Power Member

    Como defino os empregados???

    Já tenho estas tabelas criadas(SQL)... falta-me a dos empregados k julgo ser uma Super Entidade.. alguem me esclarece o k isto é, e como o faço?

    Tabela Avião

    Código:
    CREATE TABLE TblAviao (
    CodAviao INT, 
    matricula varchar(30), 
    NomeAviao varchar(30), 
    NumeroTotalHoras int, 
    Modelo varchar(30), 
    Marca varchar (30), 
    NumLugaresExecutivos int, 
    NumLugaresTuristica int, 
    NumMembrosTripulacao int, 
    primary key (codAviao) );
    Tabela Escala
    Código:
    Create Table TblEscala (
    CodEscala int, 
    Cidade varchar (40), 
    Hora DATE, 
    CodigoVoo int, 
    primary key (CodEscala));

    Tabela Inspecção

    Código:
    Create Table TblInspeccao (
    CodInspeccao int, 
    Matricula varchar (30), 
    NumOrdem int, 
    DataInspeccao DATE, 
    HoraInicio TIME, 
    HoraFim DATE, 
    TotalHorasVoo int, 
    PrimaryKey (CodInspeccao));

    Tabela Passageiros

    Código:
    Create Table TblPassageiros (
    CodPassageiro int, 
    Apelido varchar (30), 
    Nome varchar (70), 
    Sexo char(1) CHECK (sexo IN ("M", "F")), 
    telefone int, 
    MORADA , 
    primary key (CodPassageiro));
    Nesta Tabela o atributo SEXO está bem definido???

    Tabela Reserva

    Código:
    Create Table TblReserva (
    CodReserva int, 
    Classe VarChar (30), 
    IdPassageiro int, 
    IdVoo int, 
    primary Key (CodReserva));
    Tabela Voo
    Código:
    Create Table TblVoo (
    CodVoo int, 
    Matricula Varchar (40), 
    CidadePartida Varchar (40), 
    CidadeDestino Varchar (40), 
    HoraPartida DATE, 
    HoraChegada DATE, 
    MilhasPercorridas Int, 
    Primary Key (CodVoo));
    Mais uma vez Obrigado...
     
  3. HecKel

    HecKel The WORM

    Não consegues mostrar aqui o ER? Dá bastante jeito..., do enunciado dá para tirar várias interpretações e nenhuma delas pode coincidir com a tua...

    Sobre a parte do sexo, julgo que é com pelicas, pelo menos usei assim no Oracle, a linha foi concretamente esta

    abraços, HecKel
     
  4. jtcgomes

    jtcgomes Power Member

    Andei aki a inventar no access...

    [​IMG]

    o trabalho e' para ser feito em SQL...
    mas como estou no pc de fim semana não tinha aki o software instalado dos flowcharts para fazer os diagramas...

    Como relaciono os Empregados e a tripulação??

    Posso criar a tabela codigo postal como fiz?
     
  5. HecKel

    HecKel The WORM

    Bem, antes de mais visto que usas a Matricula (e bem) como chave de relação, julgo que não se justifica o Cod_Aviao, a Matricula é que devia ser chave primária visto que não devem existir 2 aviões com a mesma matricula :P Esse campo acaba por ser redundante e até corres o risco de inserires 2 aviões com características diferentes mas com a mesma matricula...

    Um voo pode ter mais do que uma escala, da forma como tens não consegues garantir N escalas para o mesmo avião, terias de criar uma tabela intermédia que iria ter como chaves primárias as chaves do voo e da escala. (Tabela resultante de uma relação de N para N)

    Depois não percebo porque detalhas os dados dos passageiros em tantas tabelas, da localidade ainda se justifica agora da rua é algo que se torna desnecessário, uma rua não vai ter tantos clientes da companhia aérea que se justifique uma tabela...

    Sobre a parte dos empregados, depende mesmo do teu DER, não estou a ver como os queres relacionar com as tabelas que tens...., mas provavelmente vais relacionar com o voo, pois um empregado está em N voos, e cada voo tem N empregados.

    Espero que te ajude ;)

    abraços, HecKel
     
  6. jtcgomes

    jtcgomes Power Member

    HecKel depois de ler o que me disseste, cheguei a estas conclusões...

    Será que está melhor?

    [​IMG]
     
  7. hYpe

    hYpe [email protected] Member

    Na tbl inspecçao tens q seleccionar mais um campo como chave...
    De preferencia a data...

    Porque se estas a usar a matricula como identificador da inspeçao, um aviao so pode ser inspecionado uma vez, já que nao podes inseri-lo de novo pois ele ja la esta..

    Cumps e bom trabalho
     
  8. jtcgomes

    jtcgomes Power Member

    ok... mais problemas??
    axam k assim já trabalha bem? ou k alteravam mais??
     
  9. HecKel

    HecKel The WORM

    Boas!

    Aqui venho eu ser mais uma vez picuinhas... :P A tabela voo não precisa do cod_escala, pois a relação é feita pelos campos cod_voo.

    Na tabela voo/escala ambas as chaves têm de ser primárias, visto que é a tabela resultante de uma relação N-N, repara, tens de garantir que um voo não faz duas vezes escala na mesma cidade, sem ambas as chaves estarem como primárias não consegues garantir isso.

    A mesma coisa para a tabela viagens, da forma como tens o mesmo empregado pode estar duas vezes na mesma viagem :X

    O resto não tomei muita atenção, mas julgo que está funcional ;)

    abraços, HecKel
     
  10. jtcgomes

    jtcgomes Power Member

    OK... Vou passar isto para SQL, já dou novidades... :002:
     
  11. jtcgomes

    jtcgomes Power Member

    Já criei as tabelas em SQL, e com sucesso... nem erro deu...

    Mas... a tabela tripulação esta a meter espécie... loool

    Código:
    CREATE TABLE Tbl_Aviao (
    Matricula VARCHAR(30), 
    Nome VARCHAR(50), 
    Numero_Total_Horas_Voo INT, 
    Modelo VARCHAR(30), 
    Marca VARCHAR(30), 
    Num_Lugares_Executivos INT, 
    Num_Lugares_Turistica INT, 
    Num_Membros_Tripulacao INT,
    PRIMARY KEY(Matricula) );
    
    CREATE TABLE Tbl_Escala (
    Cod_Escala INT,
    Cidade VARCHAR(40), 
    Hora DATE, 
    Cod_Voo INT,
    PRIMARY KEY(Cod_Escala));
    
    CREATE TABLE Tbl_Inspeccao (
    Cod_Inspeccao INT,
    Matricula varchar (30), 
    Num_Ordem_Inspeccao INT,
    Data DATE, 
    Hora_Inicio TIME, 
    Hora_Fim TIME, 
    Total_Horas_Voo INT,
    PRIMARY KEY(Cod_Inspeccao));
    
    CREATE TABLE Tbl_Passageiros (
    Cod_Passageiro INT, 
    Apelido VARCHAR(30), 
    Nome VARCHAR(70), 
    Sexo CHAR CHECK (sexo IN ('M', 'F')), 
    telefone INT, 
    Morada VARCHAR(100), 
    Cod_Postal VARCHAR(8),
    PRIMARY KEY(Cod_Passageiro));
    
    CREATE TABLE Tbl_Reserva (
    Cod_Reserva INT, 
    Classe VARCHAR(30), 
    cod_Passageiro INT, 
    cod_Voo INT, 
    PRIMARY KEY(Cod_Reserva));
    
    CREATE TABLE Tbl_Voo (
    Cod_Voo INT, 
    Matricula VARCHAR(30), 
    Cidade_Partida VARCHAR(40), 
    Cidade_Destino VARCHAR(40), 
    Hora_Partida TIME, 
    Hora_Chegada TIME, 
    Milhas_Percorridas INT, 
    PRIMARY KEY(Cod_Voo));
    
    CREATE TABLE Tbl_cod_postal(
    Cod_Postal VARCHAR(8),
    Localidade VARCHAR(25),
    PRIMARY KEY(Cod_Postal));
    
    CREATE TABLE Tbl_Tripulacao(
    Cod_tripulacao INT,
    cod_voo INT,
    data DATE,
    num_comandante INT,
    num_copiloto INT,
    num_comissario INT,
    PRIMARY KEY(Cod_tripulacao));
    
    CREATE TABLE Tbl_Empregado(
    Cod_empregado INT,
    Nome VARCHAR(70),
    Telefone INT,
    Morada VARCHAR(100),
    Cod_postal VARCHAR(8),
    Data_Admissao DATE,
    PRIMARY KEY(Cod_empregado));
    
    CREATE TABLE Tbl_Emp_Pilotos(
    Cod_empregado INT,
    num_licenca INT,
    Data_licenca DATE,
    Tipo_Aviao VARCHAR(15),
    Funcao VARCHAR(10),
    PRIMARY KEY(Cod_empregado));
    
     
  12. jtcgomes

    jtcgomes Power Member

    Bem pessoal, começo a ser chato com isto, mas desculpem lá...
    Algo aki tá errado... a tabela viagem axo k não pode ser relacionada como está em cima descrito... k disem deste diagrama?

    [​IMG]
     
  13. HecKel

    HecKel The WORM

    Nesse diagrama eu faria algo...,

    Um Voo de facto tem N escalas, e uma escala (localidade) não pode ter N Voos?

    O mesmo para a relação Inspecção-Avião, um Avião tem N inspecções e uma inspecção pode ser feita a N aviões (a menos que consideres a inspecção como o trabalho e não como a entidade de inspecções como eu estou a considerar).

    abraços, HecKel
     
  14. jtcgomes

    jtcgomes Power Member

    Na minha optica de ver isto, um avião faz várias inspecções ao longo da sua vida...

    Kuanto ás escalas, cada voo pode fazer várias escalas numa viagem...
     
  15. HecKel

    HecKel The WORM

    Yep, e eu concordo, agora vê no sentido inverso, é isso que eu vejo como uma potencial alteração.

    Uma escala é feita por vários aviões, tal como uma inspecção é feita a vários aviões ;)

    abraços, HecKel
     
  16. jtcgomes

    jtcgomes Power Member

    Cheguei a estas conclusoes:

    [​IMG]
     
  17. jtcgomes

    jtcgomes Power Member

    E criei o seguinte codigo SQL:

    Código:
    create table tf_empregado(
    id_emprg int(4),
    Nome varchar(100) not null,
    Apelido varchar(25) not null,
    Telefone int(9) not null,
    Rua varchar(100) not null,
    Numero int(3) not null,
    CPostal varchar(8)not null,
    Localidade varchar(40) not null,
    Data_entrada date not null,
    primary key(id_emprg))
    type=InnoDB;
    
    create table tf_pessoal_voo(
    id_emprg int(4),
    horas_voo int(5) not null,
    funcao varchar(10) not null,
    primary key (id_emprg))
    type=InnoDB;
    
    create table tf_comandante(
    id_emprg int(4),
    cod_funcao int(1) not null,
    num_licenca_piloto int(5) not null,
    data_emissao date not null,
    tipo_aviao varchar(10) not null,
    primary key (id_emprg))
    type=InnoDB;
    
    create table tf_copiloto(
    id_emprg int(4),
    cod_funcao int(1) not null,
    num_licenca_piloto int(5) not null,
    data_emissao date not null,
    tipo_aviao varchar(10) not null,
    primary key (id_emprg))
    type=InnoDB;
    
    create table tf_chefecabine(
    id_emprg int(4),
    cod_funcao int(1) not null,
    primary key (id_emprg))
    type=InnoDB;
    
    create table tf_navegador(
    id_emprg int(4),
    cod_funcao int(1) not null,
    primary key (id_emprg))
    type=InnoDB;
    
    create table tf_comissario(
    id_emprg int(4),
    cod_funcao int(1) not null,
    primary key (id_emprg))
    type=InnoDB;
    
    create table tf_tripulacao(
    id_tripulacao int(4),
    matricula int(5)not null,
    comandante int(4)not null,
    copiloto int(4)not null,
    chefecabina int(4) not null,
    navegador int(4),
    comissario int(4),
    primary key(id_tripulacao))
    type=InnoDB;
    
    create table tf_aviao(
    matricula int(5),
    nome varchar(15) not null,
    horas_voo int(6) not null,
    marca varchar(20) not null,
    modelo varchar(15) not null,
    lug_executiva int(3) not null,
    lug_turistico int (3) not null,
    tripulacao int(4) not null,
    primary key(matricula))
    type=InnoDB;
    
    create table tf_inspeccao(
    id_inspeccao int(6),
    matricula int(5)not null,
    data_inicio date not null,
    data_fim date not null,
    hora_inicio time not null,
    hora_fim time not null,
    horas_voo int(6) not null,
    primary key(id_inspeccao))
    type=InnoDB;
    
    create table tf_passageiro(
    id_passageiro int(5),
    apelido varchar(15)not null,
    nome varchar(20)not null,
    sexo varchar(1)not null,
    primary key(id_passageiro))
    type=InnoDB;
    
    create table tf_reserva(
    id_reserva int(8),
    classe int(1)not null,
    viagem int(6)not null,
    passageiro int(5)not null,
    primary key(id_reserva))
    type=InnoDB;
    
    create table tf_voo(
    id_voo int(5),
    cidade_Partida varchar(15)not null,
    cidade_Destino varchar(15)not null,
    hora_partida time not null,
    hora_chegada time not null,
    escala int(4)not null,
    primary key(id_voo))
    type=InnoDB;
    
    create table tf_viagem(
    id_viagem int(6),
    data date,
    voo int(5),
    aviao int(5) not null,
    horas_viagem_apos_inspeccao int(6) not null,
    primary key(id_viagem,data,voo))
    type=InnoDB;
    
    create table tf_escala(
    id_escala int(3),
    cidade varchar(15)not null,
    hora_escala time not null,
    primary key(id_escala))
    type=InnoDB;
    
    
    alter table tf_pessoal_voo
    add foreign key (id_emprg) references tf_empregado(id_emprg);
    
    alter table tf_comandante
    add foreign key (id_emprg) references tf_pessoal_voo(id_emprg);
    
    alter table tf_copiloto
    add foreign key (id_emprg) references tf_pessoal_voo(id_emprg);
    
    alter table tf_chefecabine
    add foreign key (id_emprg) references tf_pessoal_voo(id_emprg);
    
    alter table tf_navegador
    add foreign key (id_emprg) references tf_pessoal_voo(id_emprg);
    
    alter table tf_comissario
    add foreign key (id_emprg) references tf_pessoal_voo(id_emprg);
    
    alter table tf_tripulacao
    add foreign key (matricula) references tf_aviao(matricula);
    
    alter table tf_tripulacao
    add foreign key (comandante) references tf_comandante(id_emprg);
    
    alter table tf_tripulacao
    add foreign key (copiloto) references tf_copiloto(id_emprg);
    
    alter table tf_tripulacao
    add foreign key (chefecabina) references tf_chefecabine(id_emprg);
    
    alter table tf_tripulacao
    add foreign key (navegador) references tf_navegador(id_emprg);
    
    alter table tf_tripulacao
    add foreign key (comissario) references tf_comissario(id_emprg);
    
    alter table tf_inspeccao
    add foreign key (matricula) references tf_aviao(matricula);
    
    alter table tf_reserva
    add foreign key (passageiro) references tf_passageiro(id_passageiro);
    
    alter table tf_voo
    add foreign key (escala) references tf_escala(id_escala);
    
    alter table tf_viagem
    add foreign key (voo) references tf_voo(id_voo);
    
    alter table tf_viagem
    add foreign key (aviao) references tf_aviao(matricula);
    
    alter table tf_voo
    add foreign key (escala) references tf_escala(id_escala);
    
    k dizem???
     
  18. jtcgomes

    jtcgomes Power Member

    Para quem tiver curiosidade, aqui fica o relatorio que entreguei...

    Obrigado pelas vossas ajudas...
     
  19. Clausula CHECK

    Oi!

    Eh pá tou a fazer o mesmo trabalho que tu!! :-D
    Mas só que há um pequeno grande problema!!! A clausula CHECK não funciona na versão do MySQL instalado no servidor do professor, eu verifiquei isso também por acaso com a tabela de passageiros e em conversa com o professor da cadeira ele disse-me que essa clausula nao esta ainda implementada, a versão SQL instalada compila o codigo mas não o implementa, se exportares as tabelas onde uzares o CHECK vais ver que este não aprece.
    Depois de pesquisar um bocado descobri que era possivél "simular" a clausula CHECK com TRIGGERS mas há um senão!! É necessário ter permissão de do OWNER da base de dados, coisa que como sabes nós não temos!
    O professor a mim aconcelhou-me a fazer o trabalho como se tivesse a clausula implementada e no script a entregar implementar a clausula sempre que achar necessario.

    Não sei se já sabias disto (falta pouco mais de 24 horas para entragar o relatorio :-D ) mas pronto fica o aviso, sempre dá para fazer umas alteraçoes, senão podes sempre melhorar indo a exame de recurso!!! :-D

    Fica bem!!
     

Partilhar esta Página