AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 40311
Accepted
newprint
newprint
Asked: 2013-04-18 19:06:26 +0800 CST2013-04-18 19:06:26 +0800 CST 2013-04-18 19:06:26 +0800 CST

Não tenho certeza de como implementar certas restrições e relações neste esquema de banco de dados relacional

  • 772

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: diagrama de banco de dados

Aqui estão algumas coisas que não consigo descobrir:

  1. É uma boa ideia ter chaves estrangeiras como valores não int (como Varchar) ??
  2. 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.
  3. Como garantir que a cidade de chegada e a cidade de partida (da Flighttabela) sejam diferentes para um determinado voo?
mysql database-design
  • 4 4 respostas
  • 4735 Views

4 respostas

  • Voted
  1. James K. Lowden
    2013-04-18T22:04:52+08:002013-04-18T22:04:52+08:00

    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 CHECKrestriçã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 TABLEvá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.

    • 5
  2. Best Answer
    Ali
    2013-04-18T19:21:28+08:002013-04-18T19:21:28+08:00

    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 TotalSeatsna Airplanetabela e talvez escrever uma SQLconsulta que, ao examinar Status, você pode descobrir os assentos reservados e os passageiros a bordo. (Considere as melhorias de esquema sugeridas por @galuano1
    3- Você pode escrever um gatilho que garanta que não sejam iguais ou talvez validá-lo no código.

    • 2
  3. galuano1
    2013-04-18T19:19:33+08:002013-04-18T19:19:33+08:00
    1. Varchar como chave estrangeira: má ideia
    2. Não adianta ter uma tabela para apenas uma coluna.(Situação da Reserva)
    3. Remova a data e a hora do voo da tabela de voos, crie uma nova tabela chamada flight_schedule e coloque-a lá.
    4. Remova o voo sem chave estrangeira da reserva, use a chave primária flight_schedule acima mencionada como a chave estrangeira.
    5. Em seguida, use a tecla flight_schedule para descobrir o número de assentos reservados na tabela de reservas
    6. Você pode criar um gatilho para garantir que as cidades sejam diferentes, mas também pode fazer isso na camada de aplicativo, porque os gatilhos são ruins.
    • 1
  4. muratgu
    2013-04-18T19:26:54+08:002013-04-18T19:26:54+08:00

    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 ser int. exemplo:

     Flight Class
       class_id int PK 
       class_name varchar(15) Unique
    

    2) Você já tem Flight, Bookinge Booking Statustabelas com informações suficientes para derivar number of bookingse passengers, então não há necessidade de armazená-las em colunas separadas.

    3) Para manter os dados de Chegada/Partida consistentes, eu criaria uma Routetabela apenas com esses dados e vincularia à Flighttabela; em seguida, crie um gatilho de inserção/atualização na Routetabela para garantir que as cidades de chegada/partida sejam diferentes.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve