Pergunta

Eu tenho uma tabela de funcionários em um banco de dados, e eu quero ligar um empregado de seu técnico:

Employee Tabela

  • employee_id
  • first_name
  • last_name
  • manager_id

Se o manager_id é apenas uma outra linha na mesma mesa onde o gestor tem como seu empregado, qual é a melhor maneira de impor que, se eu apagar um empregado verifica que este empregado não é o gerente de outro funcionário?

Existe uma melhor prática recomendada para isso?

Foi útil?

Solução

Você pode usar um auto join como você juntar-se a outras tabelas usando PK & FK .

Eu acho que você deve projetar isso com algumas coisas a considerar. Exemplos:

  • Diferentes Gerentes: Tom é um Jr. PGMR hoje, e Jerry é o seu Gerente de hoje. Amanhã Tom pode informar o Sebastian.
  • Promoções: Tom é um Jr. PGMR hoje, e Jerry é o seu Gerente de hoje. Amanhã Tom pode se tornar um gerente de si mesmo e ter pessoas relatando a ele.
  • Promoções 2: Tom pode ir de Jr PGMR para PGMR Sr a vantagem da equipe para Líder de Projeto para Manager. Você quer salvar este?
  • Relatórios: Você pode querer mostrar hierarquia em um ponto no tempo (algum usuário virá pedir isso por um relatório mais cedo ou mais tarde)

Você pode querer considerar dividir os dados em entidades separadas - normalizar os dados da seguinte forma (ou ainda mais como suas necessidades podem ser)

  • tabela Funcionários: Informação básica empregado
  • Posição Tabela de pesquisa: Lista de todas as posições na organização
  • Employee posição da tabela:. Track com data de início e data final quando uma mudança de posição ocorreu para o empregado
  • Employee Posição tabela de hierarquia: relatórios que Employee posição para outra posição Empregado (usando uma dupla associação em vez de um auto juntar-se); com início e fim timestamps

Outras dicas

Você pode usar uma restrição de chave estrangeira (sem eliminação em cascata). Se você tentar excluir um gerente que ainda tem outros empregados sob ele, o banco de dados irá detectar que automaticamente e a operação irá falhar.

Use uma relação muitos-para-muitos associação para cobrir suas bases, se o seu aplicativo (ou organização) evoluir.

Employee.Employee_id  <- EmployeeManager.Employee_id 
                         EmployeeManager.Manager_id -> Employee.Employee_id
                         Manager_role_type
                         etc.

Sempre use restrições de chave estrangeira.

Use a chave estrangeira, aqui é uma abordagem "usual" para isso:

employee_model_01

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top