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 / 77550
Accepted
Lambo Jayapalan
Lambo Jayapalan
Asked: 2014-09-25 11:33:36 +0800 CST2014-09-25 11:33:36 +0800 CST 2014-09-25 11:33:36 +0800 CST

Tabela de arquitetura com vários caminhos para tabelas pai comuns

  • 772

Estou querendo saber como arquitetar um banco de dados quando há vários caminhos (por meio de chaves estrangeiras) para uma tabela pai comum.

Por exemplo, tenho as seguintes tabelas:

Table: Students
PK StudentId

Table: Classes
PK: ClassId

Table: ClassStudents
PK: ClassStudentId:
FK: StudentId
FK: ClassId

Table: ClassAssignments
PK: ClassAssignmentId
FK: ClassId
FK: Assignment

Agora vou criar uma nova tabela que armazena os envios de Tarefas de cada aluno. Qual é a melhor maneira de estruturá-lo de forma que um aluno de outra turma não possa ser adicionado a uma tarefa desta turma?

TABLE: ClassStudentAssignments
FK: ClassAssignmentId
FK: ClassStudentId

Existe uma maneira de lidar com isso no design do banco de dados ou teria que ser feito apenas por meio da lógica de negócios?

Agradecemos antecipadamente por qualquer ajuda.

database-design
  • 2 2 respostas
  • 312 Views

2 respostas

  • Voted
  1. Pieter Geerkens
    2014-09-25T18:16:17+08:002014-09-25T18:16:17+08:00

    Você está pensando sobre isso incorretamente. O envio de um trabalho de um aluno não matriculado no curso correspondente, se for corrigido, não é fundamentalmente diferente de um envio devidamente enviado e corrigido de um aluno que posteriormente abandona o curso. Permitir que a entrada da nota exista no banco de dados, observando que quando o relatório final das notas dos trabalhos para cada curso for gerado, a junção (interna) falhará para todos os envios de alunos não matriculados no curso no momento do exame . Isso é suficiente para implementar adequadamente a lógica de negócios.

    • 1
  2. Best Answer
    Damir Sudarevic
    2014-09-26T03:57:55+08:002014-09-26T03:57:55+08:00

    Aluno ( student_id) existe.

    student {student_id}
         PK {student_id}
    

    A classe ( class_id) existe.

    class {class_id}
       PK {class_id}
    

    Aluno ( student_id) assiste à aula ( class_id).

    student_class {student_id, class_id}
               PK {student_id, class_id}
              FK1 {student_id} REFERENCES student {student_id}
              FK2 {class_id}   REFERENCES class {class_id} 
    

    Tarefa ( task_id) existe.

    task {task_id}  
      PK {task_id}
    

    A classe ( class_id) recebe uma tarefa ( task_id).

    assignment {class_id, task_id}
            PK {class_id, task_id}      
           FK1 {class_id} REFERENCES class {class_id}
           FK2 {task_id}  REFERENCES task {task_id}  
    

    Aluno ( student_id) presente na aula ( class_id) apresentou solução para a tarefa ( task_id), atribuída à turma.

    solution {student_id, class_id, task_id}
          PK {student_id, class_id, task_id}
         FK1 {student_id, class_id} REFERENCES student_class {student_id, class_id}
         FK2 {class_id, task_id}    REFERENCES assignment {class_id, task_id}
    

    Observação:

    ... quando há vários caminhos (através de chaves estrangeiras) para uma tabela pai comum ...

    Esta é a causa raiz do problema. Não existe tal coisa no modelo relacional; chaves estrangeiras são restrições , não caminhos de navegação. Você está arrastando a terminologia OO para um banco de dados relacional e esses dois não correspondem - os paradigmas são diferentes.

    • 0

relate perguntas

  • Os índices filtrados podem ajudar a melhorar as consultas baseadas em uma hora inserida ou isso deve ser evitado?

  • Qual é a diferença entre os tipos de dados MySQL VARCHAR e TEXT?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • 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
    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