Olá pessoal! Não sei se o titulo ficou sugestivo, mas deixa-me explicar qual a minha duvida. Eu estou desenvolvendo um sistema onde vou precisar emitir relatórios de funcionários por Diretoria, Departamento ou Setor e estou com duvida de como gravar essas informações no banco de dados, qual a melhor forma de relacionar um funcionário a uma dessas lotações sendo que o organograma segue a seguinte linha: Diretoria -> Departamento -> Setor, e eu posso ter um funcionário ligado direto a um departamento sem setor ou um funcionário que é um diretor. Como ficaria o modelo físico do banco na opinião de vocês? Obrigado!
Numa visão simplista e sem conhecer o seu objetivo por completo, imagino que você pode associar à cada funcionário as informações de setor e departamento. Entretanto, como há exceções (setor sem depto), você deve permitir que essas informações sejam nulas. Note também que diretor é uma função, ou seja, ou funcionário é diretor de um departamento.
Uma das possibilidades poderia ser:
table departamento(codigo_depto, nome_depto, codigo_funcionario_diretor) => se o diretor pode ser um funcionário, ele deve ser adicionado ao departamento;
table setor (codigo_setor, nome_setor, codigo_depto) => note que o codigo_depto pode ser nulo, para setor sem departamento;
table funcionario(codigo_funcionario, nome, cpf, …, codigo_setor) => se o funcionário pode pertencer a um departamento sem ser de um determinado setor, adicione um codigo_departamento, por exemplo
Abraço.
Tanto Diretoria, departamento, setor, podem ser mapeados como sendo a mesma coisa, por exemplo: órgao(ou área, ou local, ou qualquer nome q vc gostar)
Sendo assim teriamos, considerando o nome órgao:
ORGAO
- ID
- ID_ORGAO_PAI // aqui sim vc faz a hierarquia dos órgaos
- NOME
- …
FUNCIONARIO
- ID
- LOTACAO ou ORGAO_ID //pronto o funcionario estara lotado à apenas um local
- …
Acho q é isto
Acho que vc está pensando orientado a banco, e não ao negócio em si.
Eu ainda estou aprendendo o DDD (Domain Driven Design) que é a modelagem orientada ao domínio do seu negócio, ter isso bem definido é fundamental para que o seu sistema seja coeso.
Primeiramente como foi dito, sem conhecer a idéia como um todo é difícil dar pitaco. Além disso, Diretoria, Departamento e Setor são conceitos similares, no meu ver Diretoria se encontra em um nível mais alto, departamento viria depois e setor seria uma especialização do departamento.
Dessa forma minha estruturação seria definida dessa forma:
-Diretoria
—Depto
-----Setor
Definida essa questão você precisa sentar e ver se realmente faz sentido essa coisa de departamento sem setor. De cara não me parece fazer muito sentido baseado nas experiências que já tive por aí, tendo trabalhado em grandes empresas, me refiro a maneira como era feita essa distribuição. Ou você elimina uma dessas camadas (no caso a última, setor) e trabalha direto no nível do departamento, ou você define um setor para o tal funcionário exceção, mesmo que o setor seja somente ele. Não há problema algum nisso, não existe uma regra definindo que um setor deve possuir funcionários no plural.
Ou se existe um funcionário ligado diretamente a um diretor por exemplo, como uma secretária, ela também pertence a um departamente e é setorizada, pode inclusive ser um desses casos onde a pessoa é o setor.
Como o amigo disse ali em cima Diretor também é um funcionário.
Na verdade em nenhum momento eu disse que teria um setor sem departamento, mas o que eu quis dizer foi que existe a possibilidade de ter um funcionário lotado direto a um departamento.
Ex.: Diretoria X, Departamento Y, Setor Z
Departamento Y está em X
Setor Z está Y que por sua vez está em X
Funcionário A pertence ao Departamento Y
Funcionário B pertence ao Setor Z
Funcionário B estando no setor Z, então, também está no Departamento Y e na Diretoria X
Mas Funcionário A Está apenas no Departamento Y e na Diretoria X mas não está ligado a nenhum setor
Exatamente isso como disse o Daniel_MV
-Diretoria
—Depto
-----Setor
Meu projeto é um cadastro de funcionário com o maior numero possível informações, com esse cadastro eu posso imprimir vários tipos de relatórios inclusive gerar um organograma da empresa, algo bastante simples, só não quero fazer bobagem, na verdade meu pensamento pode estar bem equivocado com essa minha lógica, o que vocês entendem por Diretoria > Departamento > Setor? como vocês organizariam essas informações em seus sistemas por exemplo?
[quote=TerraSkilll]Numa visão simplista e sem conhecer o seu objetivo por completo, imagino que você pode associar à cada funcionário as informações de setor e departamento. Entretanto, como há exceções (setor sem depto), você deve permitir que essas informações sejam nulas. Note também que diretor é uma função, ou seja, ou funcionário é diretor de um departamento.
Uma das possibilidades poderia ser:
table departamento(codigo_depto, nome_depto, codigo_funcionario_diretor) => se o diretor pode ser um funcionário, ele deve ser adicionado ao departamento;
table setor (codigo_setor, nome_setor, codigo_depto) => note que o codigo_depto pode ser nulo, para setor sem departamento;
table funcionario(codigo_funcionario, nome, cpf, …, codigo_setor) => se o funcionário pode pertencer a um departamento sem ser de um determinado setor, adicione um codigo_departamento, por exemplo
Abraço.[/quote]
Mas departamento é uma subdivisão da Diretoria, uma diretoria pode ser composta por mais de um diretor e diretor também é funcionário.
Eu acabei invertendo ali, quis dizer departamento sem setorização, ou seja, um funcionário ligado diretamente a um departamento.
Eu daria um jeito de setorizar o cara de alguma forma para não quebrar essa modelagem mais “quadrada” digamos assim.
Se é imprescindível para o seu negócio ter essa regra então terá que flexibilizar e pensar nas outras N consequências que isso trará.
MoisesGizmo
Mas você não disse isso no começo. Repetindo: sem saber o seu objetivo (e seu domínio, aproveitando o gancho do Daniel_MV), é difícil dizer o que precisa ser feito. Agora que você deu mais detalhes, é possível te sugerir abordagens diferentes. Aliás, o Daniel_MV sugeriu uma boa abordagem, em que setores sempre existem, independente de haver um ou vários funcionários nele. Há algum impedimento em adotar a modelagem sugerida por ele? O que você já modelou e de que forma o fez?
Olhando novamente sua descrição, me fica outra pergunta: por que a diretoria tem que ser uma entidade? Ela não pode ser uma atribuição (função) presente no departamento? Isso poderia gerar uma estrutura assim:
depto (codigo_departamento, descricao) => mapeia departamentos
diretoria (codigo_diretoria, codigo_depto, codigo_funcionario) => mapeia 1 ou mais diretores de um determinado departamento
setor (codigo_setor, codigo_departamento, descricao) => mapeia um ou vários setores para um departamento
funcionario (codigo_funcionario, nome, …, codigo_setor) => mapeia um ou vários funcionários para um setor
Se a diretoria precisa necessariamente ser uma entidade, pode-se fazer algo como:
diretoria (codigo_diretoria, descricao) => mapeia as diretorias
diretores (codigo_diretoria, codigo_funcionario) => mapeia 1 ou mais diretores (que são funcionários) de um determinada diretoria
depto (codigo_departamento, descricao, codigo_diretoria) => mapeia departamentos dependentes de uma diretoria
setor (codigo_setor, codigo_departamento, descricao) => mapeia um ou vários setores para um departamento
funcionario (codigo_funcionario, nome, …, codigo_setor) => mapeia um ou vários funcionários para um setor
Perceba que há várias possibilidades, dependendo do cenário a ser modelado.
Abraço.
Que salada, agora vao até forçar o funcionario em um canto pra ele se ajustar ao sistema? O fato é que podem haver funcionarios lotados tanto na diretoria quanto em seus departamentos, setores e etc.
Bom, nao sei pq fui completamente ignorado, mas vou tentar novamente, a forma que indiquei elimina todo este monte de tabelas, ja vi sendo feito assim, e é como eu faria.
Percebam que diretoria, departamento, setor, subsetor, é tudo a mesma coisa, todos são uma entidade dentro da organização, entao poderia e deveriam ser mapeados como a mesma coisa, mudando apenas a descrição.
Vou mudar o nome pra ver se resolve:
entidade_organizacional(codigo_entidade_organizacional, codigo_entidade_organizacional_pai, descricao)
funcionario(codigo_funcionario, codigo_entidade_organizacional, …)
Nao vejo outra forma de atender os requisitos que ele pediu:
-Diretoria <== funcionario pode estar lotado aqui
—Depto <== funcionario pode estar lotado aqui
-----Setor <== funcionario pode estar lotado aqui
pra fazer como estão discutindo teria que ter uma tosquice do tipo:
funcionario(codigo, codigo_diretoria, codigo_depto, codigo_Setor) sendo que dois ficariam nulo, e torcer pra nao mudarem o organograma da empresa inserindo seções tambem
fredferrao
Você não foi ignorado. Entendi sua sugestão e ela é é boa, até porque permite n hierarquias dependentes (o que facilitaria e muito criar um organograma, por exemplo) e a alocação (acho que é um termo mais adequado) do funcionário em qualquer nível da hierarquia, coisa que um modelo como o que eu sugeri não permite. O (pequeno) contratempo é que exige um pouco mais de engenharia para trabalhar os múltiplos níveis, pois a modelagem é mais genérica. Veja que frisei, desde o começo, que há diferentes possibilidades, dependendo do domínio.
Abraço.
[quote=fredferrao]Que salada, agora vao até forçar o funcionario em um canto pra ele se ajustar ao sistema? O fato é que podem haver funcionarios lotados tanto na diretoria quanto em seus departamentos, setores e etc.
Bom, nao sei pq fui completamente ignorado, mas vou tentar novamente, a forma que indiquei elimina todo este monte de tabelas, ja vi sendo feito assim, e é como eu faria.
Percebam que diretoria, departamento, setor, subsetor, é tudo a mesma coisa, todos são uma entidade dentro da organização, entao poderia e deveriam ser mapeados como a mesma coisa, mudando apenas a descrição.
Vou mudar o nome pra ver se resolve:
entidade_organizacional(codigo_entidade_organizacional, codigo_entidade_organizacional_pai, descricao)
funcionario(codigo_funcionario, codigo_entidade_organizacional, …)
Nao vejo outra forma de atender os requisitos que ele pediu:
-Diretoria <== funcionario pode estar lotado aqui
—Depto <== funcionario pode estar lotado aqui
-----Setor <== funcionario pode estar lotado aqui
pra fazer como estão discutindo teria que ter uma tosquice do tipo:
funcionario(codigo, codigo_diretoria, codigo_depto, codigo_Setor) sendo que dois ficariam nulo, e torcer pra nao mudarem o organograma da empresa inserindo seções tambem :P[/quote]
Cara, vc não foi ignorado, cada um da sua sugestão para o problema em questão, foi o que o autor do tópico pediu.
E com todo respeito, salada é isso que você está propondo.
“Percebam que diretoria, departamento, setor, subsetor, é tudo a mesma coisa”
Tome cuidado com essa afirmação, ela pode ser interpretada dessa forma de um modo bem generalista, mas não é bem assim não, se você entrar no nível do detalhe as coisas são diferentes cara. Você já trabalhou em alguma multinacional, em algum banco? Eu já, e não estou aqui dando uma de gostoso, mas acho difícil alguém que já trabalhou em instituições com o nº de funcionários na ordem do milhar, concordar com essa sua afirmação.
Pense em um Jurídico. Ok, na prática todo mundo fala Depto. Jurídico. Mas um jurídico pertence a uma diretoria, muitas vezes é um andar inteiro dentro de uma corporação, existem departamentos que cuidam de problemas diferentes. Dentro de cada departamento existem funções diferentes, que podemos classificar como setores.
RH por exemplo, tem a parte de recrutamento e seleção, treinamentos, contratações e demissões, organização de eventos.
Imagine uma montadora, um banco, um hospital, utilizando essa sua modelagem.
3 níveis de abstração pode ser muito se você estiver modelando a padaria do Zé, se o seu sistema for atender uma empresa com mais de 300 funcionários a coisa muda de figura, a gente poderia destrinchar isso em até mais níveis, mas acredito não ser o caso pois o próprio autor do tópico já sugeriu os 3 níveis em que está trabalhando.
Na minha opinião sua modelagem é pobre pois é simplista demais, o simples é bom até um certo ponto. Pode funcionar para uma empresa pequena assim como a minha sugestão pode ser demais neste caso. Mas a sua não vai funcionar em uma empresa com mais de 300 funcionários (ou vai funcionar sem coesão nenhuma). Além disso é errada do ponto de vista de domínio, veja que se a empresa possui diretorias não faz sentido o cara estar em um departamento sem estar em uma diretoria, é uma relação de dependência, não existe departamento avulso.
Novamente, tudo depende do que o autor do tópico está construindo. Eu sugiro pensar no domínio e não em como encaixar isso no banco, essa deve ser a última das preocupações.
Em relação a forçar o funcionário a pertencer a um setor para se ajustar ao sistema concordo que soa como gambiarra, mas novamente vem a questão do domínio. Ao meu ver qualquer um que trabalhe em uma empresa (e não informal ou autônomo) trabalha em algum lugar (depto) e faz alguma coisa (função/setor), logo, ao meu ver não é nenhum absurdo, não é detalhe demais, é informação pertinente ao domínio do negócio.
Abraço
Bom, este modelo eu vi no meu antigo emprego, que era na maior(senao a 2ª maior) empresa(em numero de funcionarios) do Brasil 120K ±, e não na padaria do zé.
Só para esclarecer o que ja devia ser óbvio, quando digo “diretoria, departamento, setor” são tudo a mesma coisa, é CLARO que estou falando a nivel de sistema, de abstração no sistema, CLARO que na empresa não é a mesma coisa.
Por ultimo, apesar do modelo que falei parecer o mais simples(por ser uma tabela), ele é o que engloba todas as opções que foram discutidas acima, sem a necessidade deste monte de tabelas.
[quote=fredferrao]Que salada, agora vao até forçar o funcionario em um canto pra ele se ajustar ao sistema? O fato é que podem haver funcionarios lotados tanto na diretoria quanto em seus departamentos, setores e etc.
Bom, nao sei pq fui completamente ignorado, mas vou tentar novamente, a forma que indiquei elimina todo este monte de tabelas, ja vi sendo feito assim, e é como eu faria.
Percebam que diretoria, departamento, setor, subsetor, é tudo a mesma coisa, todos são uma entidade dentro da organização, entao poderia e deveriam ser mapeados como a mesma coisa, mudando apenas a descrição.
Vou mudar o nome pra ver se resolve:
entidade_organizacional(codigo_entidade_organizacional, codigo_entidade_organizacional_pai, descricao)
funcionario(codigo_funcionario, codigo_entidade_organizacional, …)
Nao vejo outra forma de atender os requisitos que ele pediu:
-Diretoria <== funcionario pode estar lotado aqui
—Depto <== funcionario pode estar lotado aqui
-----Setor <== funcionario pode estar lotado aqui
pra fazer como estão discutindo teria que ter uma tosquice do tipo:
funcionario(codigo, codigo_diretoria, codigo_depto, codigo_Setor) sendo que dois ficariam nulo, e torcer pra nao mudarem o organograma da empresa inserindo seções tambem :P[/quote]
Eu entendi sua sugestão e até pensei em fazer dessa forma pois tornaria tudo mais fácil, só que isso pode atender a uma pequena até média empresa, mas uma grande empresa com uma grande quantidade de funcionários e com uma estrutura bem definida não atenderia. O outro problema seria na hora de gerar o organograma pois dessa forma sugerida fica mais complicado de definir hierarquias, ou não.
Como resolveria essa questão?
Um amigo sugeriu que eu organizasse por Função ou Cargo e esse seria ligado a uma Diretoria, Departamento ou Setor. Dessa forma eu apenas informaria qual a função ou cargo do Funcionário.
Achei interessante, mas depois pensei se não cairia na mesma questão.
Segundo a ajuda e sugestão de vocês, nós só temos duas opções: A sugestão do Daniel_MV e a outra do fredferrao, não sei se entendi direito a sugestão do TerraSkilll, mas tentar setorizar tudo não seria legal.
Percebam que não tenho nenhuma noção sobre isso, vou aceitar a melhor alternativa sugerida.
[quote=fredferrao]Que salada, agora vao até forçar o funcionario em um canto pra ele se ajustar ao sistema? O fato é que podem haver funcionarios lotados tanto na diretoria quanto em seus departamentos, setores e etc.
Bom, nao sei pq fui completamente ignorado, mas vou tentar novamente, a forma que indiquei elimina todo este monte de tabelas, ja vi sendo feito assim, e é como eu faria.
Percebam que diretoria, departamento, setor, subsetor, é tudo a mesma coisa, todos são uma entidade dentro da organização, entao poderia e deveriam ser mapeados como a mesma coisa, mudando apenas a descrição.
Vou mudar o nome pra ver se resolve:
entidade_organizacional(codigo_entidade_organizacional, codigo_entidade_organizacional_pai, descricao)
funcionario(codigo_funcionario, codigo_entidade_organizacional, …)
Nao vejo outra forma de atender os requisitos que ele pediu:
-Diretoria <== funcionario pode estar lotado aqui
—Depto <== funcionario pode estar lotado aqui
-----Setor <== funcionario pode estar lotado aqui
pra fazer como estão discutindo teria que ter uma tosquice do tipo:
funcionario(codigo, codigo_diretoria, codigo_depto, codigo_Setor) sendo que dois ficariam nulo, e torcer pra nao mudarem o organograma da empresa inserindo seções tambem :P[/quote]
Entendo sua preocupação e confesso que pensei em fazer dessa forma, mas depois percebi que “PODERIA” ser um POG, não sei, achei melhor pesquisar mais.
[quote=MoisesGizmo][quote=fredferrao]Que salada, agora vao até forçar o funcionario em um canto pra ele se ajustar ao sistema? O fato é que podem haver funcionarios lotados tanto na diretoria quanto em seus departamentos, setores e etc.
Bom, nao sei pq fui completamente ignorado, mas vou tentar novamente, a forma que indiquei elimina todo este monte de tabelas, ja vi sendo feito assim, e é como eu faria.
Percebam que diretoria, departamento, setor, subsetor, é tudo a mesma coisa, todos são uma entidade dentro da organização, entao poderia e deveriam ser mapeados como a mesma coisa, mudando apenas a descrição.
Vou mudar o nome pra ver se resolve:
entidade_organizacional(codigo_entidade_organizacional, codigo_entidade_organizacional_pai, descricao)
funcionario(codigo_funcionario, codigo_entidade_organizacional, …)
Nao vejo outra forma de atender os requisitos que ele pediu:
-Diretoria <== funcionario pode estar lotado aqui
—Depto <== funcionario pode estar lotado aqui
-----Setor <== funcionario pode estar lotado aqui
pra fazer como estão discutindo teria que ter uma tosquice do tipo:
funcionario(codigo, codigo_diretoria, codigo_depto, codigo_Setor) sendo que dois ficariam nulo, e torcer pra nao mudarem o organograma da empresa inserindo seções tambem :P[/quote]
Eu entendi sua sugestão e até pensei em fazer dessa forma pois tornaria tudo mais fácil, só que isso pode atender a uma pequena até média empresa, mas uma grande empresa com uma grande quantidade de funcionários e com uma estrutura bem definida não atenderia. O outro problema seria na hora de gerar o organograma pois dessa forma sugerida fica mais complicado de definir hierarquias.
Como resolveria essa questão?[/quote]
Porque nao atenderia uma empresa grande? Repito, eu vi este modelo em uma empresa nacional com 120mil funcionarios.
O Orgao publico que trabalho atualmente, tambem usa o mesmo modelo, nao estou entendendo a visao de voces de que este modelo eh para pequenas coisas.
Na verdade eu vejo o contrario, em pequenas empresas onde o organograma e consequentemente o nivel hierarquico eh pequeno eh facil deixar como vcs sugerem, tudo estatico e definido, agora em empresas grandes, PRINCIPALMENTE nas grandes, o organograma muda com frequencia, agora imagina que toda vez que mudar o organograma vc ter que refatorar o sistema, pq tudo eh estatico, no modelo que sugeri eh uma mera questao de fazer um cadastro do novo setor e dizer onde ele se encaixa na hierarquia.
Entao, nao que eu seja a voz da razao, pode sim ter outras maneiras de se fazer isto, eu soh nao estou enchergando uma maneira melhor de fazer isto, principalmente com a possibilidade de se lotar o funcionario em qualquer um dos niveis hierarquicos.
Sobre gerar o organograma, eh uma questao de percorrer(recursivamente?) os setores e ir gerando. Se vc esta no nivel mais embaixo basta ir subindo ate encontrar um setor que o PAI seja nulo. Se esta no mais alto basta descer recursivamente criando a arvore.
Convencido!!!
Eu entendi perfeitamente a sugestão do fredferrao e estou convencido que seja a melhor maneira de resolver meu problema, mesmo porque meu tempo é curto e preciso avançar nesse projeto.
Obrigado fredferrao!
Obrigado a todos!
Não é óbvio e não, essas entidades não são a mesma coisa. Se não é na vida real, não deve ser no sistema também. Seu domínio em termos de classes deve refletir seu problema real.
Mas se essa abordagem funcionou com 120K bacana, o importante é resolver o problema.
Agora uma dúvida, nesse caso que vc mencionou lá no começo:
FUNCIONARIO
- ID
- LOTACAO ou ORGAO_ID //pronto o funcionario estara lotado à apenas um local
- …
E se o funcionário pertencer a um departamento e a uma diretoria? Como fica?
[quote=Daniel_MV][quote=fredferrao]
Só para esclarecer o que ja devia ser óbvio, quando digo “diretoria, departamento, setor” são tudo a mesma coisa, é CLARO que estou falando a nivel de sistema, de abstração no sistema, CLARO que na empresa não é a mesma coisa.
[/quote]
Não é óbvio e não, essas entidades não são a mesma coisa. Se não é na vida real, não deve ser no sistema também. Seu domínio em termos de classes deve refletir seu problema real.
Mas se essa abordagem funcionou com 120K bacana, o importante é resolver o problema.
Agora uma dúvida, nesse caso que vc mencionou lá no começo:
FUNCIONARIO
- ID
- LOTACAO ou ORGAO_ID //pronto o funcionario estara lotado à apenas um local
- …
E se o funcionário pertencer a um departamento e a uma diretoria? Como fica?[/quote]
O funcionario vai pertencer a um local apenas, quem vai definir a hieraquia eh o orgao.
Ex:
| 1 | PRESIDENCIA | PAI: NULL |
| 2 | DIRETORIA DE TI | PAI: 1 - PRESIDENCIA |
| 3 | DEPARTAMENTO DE DESENVOLVIMENTO DE SISTEMAS | PAI: 2 - DIRETORIA DE TI |
| 1 | JOAO DA SILVA | LOTACAO: 3 - DEPARTAMENTO DE DESENVOLVIMENTO DE SISTEMAS |
Pra saber se este funcionario eh subordinado a Diretoria de TI basta ir subindo a hierarquia da lotacao dele.
Mas estamos falando de lotacao e isto, ate onde sei o funcionario tem apenas uma, se acaso existir em algum lugar um funcionario que precise ser lotado em mais de um local, ai eh fazer um ManyToMany
[quote=Daniel_MV]
Não é óbvio e não, essas entidades não são a mesma coisa. Se não é na vida real, não deve ser no sistema também. Seu domínio em termos de classes deve refletir seu problema real.
Mas se essa abordagem funcionou com 120K bacana, o importante é resolver o problema.
Agora uma dúvida, nesse caso que vc mencionou lá no começo:
FUNCIONARIO
- ID
- LOTACAO ou ORGAO_ID //pronto o funcionario estara lotado à apenas um local
- …
E se o funcionário pertencer a um departamento e a uma diretoria? Como fica?[/quote]
Este é um assunto interessante e conheço pessoas que assim como eu, também se aperta nessas coisas. No meu caso não acontece de um funcionário pertencer a duas categorias, mas acredito que possa acontecer em situações especificas e é fácil de resolver.