Projetando relacionamentos em torno de uma estrutura de herança
Eu tenho uma pergunta conceitual sobre a melhor forma de organizar meu banco de dados.
Atualmente, tenho quatro tabelas principaisusers
, teachers
, students
enotifications
. No entanto, tanto oteachers
estudents
tabelas herdam dousers
tabela para conter a chave estrangeirauser_id
.
onotifications
tabela como você deve ter adivinhado refere-se a notificações. Eles precisam aparecer para todos os usuários que pertencem a um grupo de funcionários, isto é, sob o emprego de outro.
Alunos e professores podem empregar outros usuários.
Portanto, o cerne é que preciso de uma maneira eloquente de modelar isso. O fluxo de trabalho básico do código seria o seguinte:
getCurrentUser->getAllEmployer(s)->getNotifications
Este é o Laravel Eloquent a que estou acostumado$user->employers()->notifications;
Infelizmente, não é tão simples assim, como neste caso, um empregador pode se referir a duas tabelas.
Então, minhas escolhas são as seguintes.
Crie um relacionamento eloquente para os doisstudent
eteacher
relacionamento como empregadores. O déficit é que eu preciso escrever se testes para verificar se o usuário atual pertence a algum deles e esse código seria repetido com freqüência.Adicione umteacher_id
estudent_id
aousers
mesa. No entanto, um seria obviamente redundante em cada registro. A chance de precisar adicionar outras colunas também é muito provável devido ao surgimento de novas entidades empregadoras.Criar umemployer_employee
tabela que contém duas colunas fazendo referência a umuser_id
. Uma consulta SQL deixaria JOIN ambosstudent
eteacher
mesas com oemployer_employee
tabela e, em seguida, um JOIN comnotifications
retornaria todos os relevantes. No entanto, tantas associações reduziriam a velocidade da consulta quando comparadas com as outras opções.Algo que não considerei.Estou realmente procurando o mais eficiente,escalável solução.
Qualquer ajuda é apreciada. Se você pudesse esclarecer por que sua resposta é a solução escalável mais eficiente, seria excelente.