Estou projetando o dB para o banco de dados de passagens aéreas do projeto escolar. (Usando o MySQL workbench)
Até agora, criei o seguinte design:
Aqui estão algumas coisas que não consigo descobrir:
- É uma boa ideia ter chaves estrangeiras como valores não int (como
Varchar
) ?? - O banco de dados precisa, de alguma forma, acompanhar o número de assentos reservados e o número de passageiros a bordo para um determinado voo. Não tenho ideia de onde colocar esses atributos.
- Como garantir que a cidade de chegada e a cidade de partida (da
Flight
tabela) sejam diferentes para um determinado voo?
Você obtém o que você paga no SO. O conselho contra o uso de chaves naturais (nomes em vez de números, neste caso) é comum, mas equivocado. Se você não acredita em mim, pergunte ao seu professor.
O número de assentos parece ser uma propriedade do avião, certo? O número de assentos reservados parece ser a contagem de assentos reservados, agrupados por número de voo.
As cidades de chegada e partida podem ser restritas com uma
CHECK
restrição. Você também pode querer garantir que as partidas aconteçam antes das chegadas (assumindo o aeroporto do século XXI).Seu design é muito bom, melhor do que alguns dos conselhos que você está recebendo. Atenha-se a ele, não se preocupe com os tipos de dados para suas chaves, não procure fantasias como gatilhos para implementar a lógica do aplicativo (e não imponha restrições reais ao aplicativo). Faça RTFM
CREATE TABLE
várias vezes. Se você pensar em uma restrição que não pode ser declarada, sugiro que a documente em seu projeto como uma falha no SGBD.Pense com muito cuidado sobre o que é único. Duvido que você precise de BookingID, porque PassengerID, Flight# e Seat parecem ser únicos. Os passageiros são complexos (em um banco de dados real, você teria um monte de tabelas para descrever alguém), então eles precisam de um ID para referência conveniente, mas ainda assim você provavelmente não gostaria de dois registros compartilhando nome e endereço.
1- Prefira
int
. Em primeiro lugar, é melhor ter chaves com comprimentos mais curtos. E mais tarde, se você atualizar o status de um voo, poderá.2- Você pode ter
TotalSeats
naAirplane
tabela e talvez escrever umaSQL
consulta que, ao examinarStatus
, você pode descobrir os assentos reservados e os passageiros a bordo. (Considere as melhorias de esquema sugeridas por @galuano13- Você pode escrever um gatilho que garanta que não sejam iguais ou talvez validá-lo no código.
1) Mantenha as colunas PK como
int
, sem significado comercial, e também tenha uma coluna exclusiva com significado comercial. Isso significa que os FKs também devem serint
. exemplo:2) Você já tem
Flight
,Booking
eBooking Status
tabelas com informações suficientes para derivarnumber of bookings
epassengers
, então não há necessidade de armazená-las em colunas separadas.3) Para manter os dados de Chegada/Partida consistentes, eu criaria uma
Route
tabela apenas com esses dados e vincularia àFlight
tabela; em seguida, crie um gatilho de inserção/atualização naRoute
tabela para garantir que as cidades de chegada/partida sejam diferentes.