Onde temos os seguintes tipos de pessoas(ou cargos): agente, analista, supervisor, coordenador e gerente.
Como eu fiz:
Eu criei uma tabela para cada tipo desses, + uma tabela de usuário que contem o login e senha para acessar o sistema.
As tabelas contem quase as mesmas informações, algumas vão ter menos ou mais atributos. Ex: agente tem mais atributos que supervisor.
Problema:
Todas essas tabelas tem em relação a tabela “cargo”. 1 cargo - N agentes.
Só que seguindo a seguinte situação. Se eu criar um agente, e futuramente ele se promovido para supervisor, eu só vou alterar o seu cargo, mas ele vai permanecer na tabela “agente”.
É só fazer um auto relacionamento na própria tabela funcionário, só referenciar a chave estrangeira para a chave primária da mesma tabela, no caso a funcionário.
Procurei aqui algumas informações sobre auto-relacionamento.
Basicamente eu teria a tabela funcionario, que teria dentro dela os atributos como:
id(int, notnull) PK
nome(varchar, notnull)
cargoId(int, notnull) - FK
supervisorID (int, null)- FK (ONDE ESSAS SEGUINTES FK’s são a chave primaria da propria tabela funcionario)
coordenadorID (int, null)- FK
gerenteID (int, null)- FK
Então se o proprio funcionário for um “supervisor”, ele vai ficar com o campo null.
Assim você tem todos os funcionários relacionados entre si, e relacionados com cargos e funções, você pode selecionar um gerente de um operador pelo seu supervisor, você pode buscar todos os operadores de um supervisor, você pode saber quantos supervisores um gerente tem, e etc. Você pode ainda buscar por cargos ou funções.
Caso o auto relacionamento seja N:N, você pode criar uma nova tabela para registrar os relacionamentos, exemplo seria dois supervisores para o mesmo funcionário.