[AJUDA] - Base dados de um Aeroporto

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
Uma compania aérea pertende um sistema de informação para controlo do seu pessoal e aeronaves e respectivos voos. Os empregados são identificados univocamente por um numero de empregado. Adicionalmente são caracterizados por um nome, morada, num telefone e data de admissão na companhia. Os nomes são partidos de forma a destacar o último nome dos restantes.

De entre os empregados, é necessário caracterizar de forma mais completa o pessoal de voo. Para membros de pessoal de voo, registam-se ainda o número de horas de voo e a respectiva função(as funçoes possiveis são:chefe de cabina, comissário, navegador, comandante e co-piloto). Para os comandantes e co-pilotos é ainda necessário conhecer o numero e a data das respectivas licenças de pilotagem e o tipo de avião que estão habilitados a tripular. Admite-se que a cada instante, cada um só está habilitado a tripular um tipo de avião.

Os aviões são identificados univocamente atraves das respectivas matriculas, possuem ainda um nome, numero total de horas de voo, marca, modelo, numero de lugares em classe executiva, numero de lugares em classe turistica, numero de membros das respectivas tripulações, e funçoes dos mesmos. Admite-se que algumas tripulações não incluam navegador.
Em cada tripulação há um só chefe de cabina, um só comandante e um só co-piloto. A composição das tripulações é tipica de cada avião e não depende do voo k esteja a executar em cada caso.

Os aviões são submetidos a inspeções periodicamente. Pretende-se manter um registo dessas inspecções. Cada inspeção é identificada atraves da matricula do avião a k diz respeito e por um número de ordem. É ainda caracterizada pelas datas e hora de inicio e fim e pelo número de horas de voo do avião no inicio da inspecção.

Os voos são identificados univocamente por um código de 5 caracteres. são ainda caracterizados por uma cidade de inicio e de fim, uma hora de partida e uma hora de chegada, e por um numero de milhas percorridas. Podem ainda possuir um número variavel de escalas ou não possuir nenhumas. Cada escala efectua-se numa cidade a uma dada hora. Cada voo ocorre, no máximo, 1 vez por dia. Uma viagem é um voo executado num dia.

Pertende-se registar a alocação dos elementos do pessoal de voo, e avioes ás várias viagens. Apos a execução das viagens, os registos de alocação do pessoal e avioes não sao apagados da base de dados. É necessário garantir que o comandante e co-piloto atribuidos a uma dada viagem estão habilitados a tripular o avião alocado para essa viagem. Alem disso é necessário que o avião atribuido a cada viagem não possui mais do que 5000 horas de voo desde a ultima inspecção.

Os passageiros efectuam reservas de lugar para as viagens. As reservas são identificadas univocamente por um código de reserva de 8 caracteres e são feitas numa dada classe para uma dada viagem e para um unico passageiro. Os passageiros são identificados internamente por um número e ainda são caracterizados pelo sexo, apelido e resto do nome.
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...
 
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...
 
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

(...)

sexo char(1) not null check (sexo in ('M', 'F')),

(...)

abraços, HecKel
 
Andei aki a inventar no access...



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?
 
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
 
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
 
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
 
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));
 
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
 
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...
 
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
 
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???
 
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!!
 
Back
Topo