Relacionamento de tabelas com os mesmos atributos

votar contra
favorita
tenho a seguinte situação.

Meu sistema é para controle de funcionários.

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”.

O que pode ser feito ?

faça uma tabela funcionário com os dados básicos nome, rg, endereço, etc, outra tabela para cargos, e outra tabela para funções.

FUNCIONARIOS (0,N) ---------- <> ------------ (1,1) CARGOS (1, N) -------------<>------------- (1,N) FUNCOES

FUNCIONARIOS

  • id
  • nome
  • cpf
  • endereço

CARGOS

  • id
  • nome
  • descricao

FUNCOES

  • id
  • nome
  • descricao

FUNCIONARIOS_CARGOS

  • id_funcionario
  • id_cargo

CARGOS_FUNCOES

  • id_cargo
  • id_funcoes

Baseado nos relacionamentos acima, as funções de um funcionário vai depender do cargo, assim não teria atributos vazios nas suas tabelas.

Entendi,

Mas tenho algumas regras, por exemplo:

1 Agente - tem 1 Supervisor

Eu não posso no relacionamento de funcionário, pois nem todos os funcionários tem supervisor.

É 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.

Então eu terei vários autos-relacionamentos com a tabela funcionário ?

Funcionario > Gerente
Funcionario > Coordenador
Funcionario > Supervisor

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.

Correto ?

Amigo gerente, coordenador e supervisor passaria a ser um registro da tabela cargo, segue analogia abaixo:

Funcionário:

id: 1 nome: Bruno , id_funcionario: null
id: 2 nome: Pedro, id_funcionario: 1
id: 3 nome: Felipe, id_funcionario: 2

Cargo:

id: 1 nome: Gerente
id: 2 nome: Supervisor
id: 3 nome: Operador

Funções:

id: 1 descrição: Gerenciar
id: 2 descrição: Supervisionar
id: 3 descrição: Operar
id: 4 descrição: Atender

Funcionários_Cargos:

bruno – <> – gerente
bruno – <> – ( pedro – <> – supervisor )
bruno – <> – ( pedro – <> – ( felipe – <> – operador) )

Cargo_Funções:

gerente – <> – gerenciar
supervisor – <> – supervisionar
operador – <> – operar
operador – <> – atender

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.