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.
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.
Aluno (
student_id
) existe.A classe (
class_id
) existe.Aluno (
student_id
) assiste à aula (class_id
).Tarefa (
task_id
) existe.A classe (
class_id
) recebe uma tarefa (task_id
).Aluno (
student_id
) presente na aula (class_id
) apresentou solução para a tarefa (task_id
), atribuída à turma.Observação:
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.