Chaves compostas - Melhor solução

Java

Modelagem

12/05/2015

Pessoal, sou novo na tecnologia (Java) e acredito já ter pesquisado bastante sobre o assunto, mas até agora não vi nada que me indicasse um caminho concreto para a situação abaixo:

Tenho um database que deverá ser utilizado após a migração entre as plataformas PowerBuilder e Java, grande parte desse database está condicionado como a seguir e realmente fiquei na dúvida sobre qual método utilizar, manter as chaves nesta disposição e usar Class Id ou alterar a estrutura das tabelas para utilizar chaves simples. Alguém se habilita a montar a classe para a entidade colaborador ?

Grato desde já pela ajuda.

empresa
-----------
id_empresa (pk)
nu_cnpj
nm_fantasia
de_razaosocial

filial
-----
id_empresa (pk)(fk)
id_filial (pk)
nm_filial
de_endereco
.....

organograma
-----------------
id_empresa (pk)(fk)
id_filial (pk)(fk)
id_organograma (pk)
de_organograma

colaborador
---------------
id_empresa (pk)(fk)
id_filial (pk)(fk)
id_colaborador (pk)
id_organograma (fk)
nm_colaborador
.....
Marcos Motta

Marcos Motta

Curtidas 0

Respostas

Marcos Motta

Marcos Motta

12/05/2015

Ninguém???


Pessoal, sou novo na tecnologia (Java) e acredito já ter pesquisado bastante sobre o assunto, mas até agora não vi nada que me indicasse um caminho concreto para a situação abaixo:

Tenho um database que deverá ser utilizado após a migração entre as plataformas PowerBuilder e Java, grande parte desse database está condicionado como a seguir e realmente fiquei na dúvida sobre qual método utilizar, manter as chaves nesta disposição e usar Class Id ou alterar a estrutura das tabelas para utilizar chaves simples. Alguém se habilita a montar a classe para a entidade colaborador ?

Grato desde já pela ajuda.

empresa
-----------
id_empresa (pk)
nu_cnpj
nm_fantasia
de_razaosocial

filial
-----
id_empresa (pk)(fk)
id_filial (pk)
nm_filial
de_endereco
.....

organograma
-----------------
id_empresa (pk)(fk)
id_filial (pk)(fk)
id_organograma (pk)
de_organograma

colaborador
---------------
id_empresa (pk)(fk)
id_filial (pk)(fk)
id_colaborador (pk)
id_organograma (fk)
nm_colaborador
.....
GOSTEI 0
Randrade

Randrade

12/05/2015

O seu título confundiu um pouco. A elaboração do título pode fazer uma pessoa clicar ou não para ajudar a responder a sua pergunta.

Mas, vamos lá.

No seu caso não há necessidade de utilizar chaves compostas. para falar a verdade, acho que alguém apenas colocou (pk) para tentar dizer algo.

O que você colocou é um simples caso de relacionamento, de 1:N ou N:N em alguns casos.

para você entender melhor, "era aconselhável" usar chave composta, nestes tipos de casos do exemplo.

"A ideia de chave composta é ter mais de um campo na chave primária." Em seu caso, não há necessidade disso.

Sua classe colaborador ficaria assim:

colaborador
---------------
id_colaborador (pk)
id_empresa (fk)
id_filial (fk)
id_organograma (fk)
nm_colaborador


Onde um colaborador possui um relacionamento para Empresa, Filial e Organograma.

OBS.: Você não especificou o ambiente. Assim, imaginei desta forma. Porém se possuir o relacionamento de N:N, 1:N, 1:1, você deverá modificar as chaves, de acordo com seu ambiente.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

12/05/2015

Não sei de fato quais são as regras de negócios, mas no meu ponto de vista esta modelagem não está adequada.
Minha sugestão:
FILIAL
-----------
id_empresa (pk)
razaosocial
cnpj
inscricaoestadual
nomefantasia
tipofilial ------ M = Matriz, F = Filial
id_organograma (FK)
id_endereco (FK) -- criar uma tabela para os endereços


organograma
-----------------
id_organograma (pk)
de_organograma

colaborador
---------------
id_colaborador (pk)
id_filial (FK)
id_endereco (FK)
nm_colaborador
.....

GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

12/05/2015

Bom, eu faria o seguinte na classe colaborador:

colaborador
---------------
id_colaborador (pk)
id_filial (fk)
nm_colaborador
.....

cria uma chave única (uk) = id_colaborador, id_filial
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

12/05/2015

Bom, eu faria o seguinte na classe colaborador:

colaborador
---------------
id_colaborador (pk)
id_filial (fk)
nm_colaborador
.....
 
cria uma chave única (uk) = id_colaborador, id_filial
GOSTEI 0
Marcos Motta

Marcos Motta

12/05/2015

Muito obrigado pelo esclarecimento, a situação aponta exatamente o problema encontrado no link enviado... a aplicação comporta múltiplos registros de empresa, filial, etc e eventualmente estes registros se repetem. Para solucionar o problema eu já tentei utilizar class id, porém na montagem das classes mais complexas, como a de colaborador, a solução não saiu...
Onde posso encontrar exemplos de classes que tratem deste assunto? Em minhas buscas encontrei muitas soluções baseadas em classes simples, mas nem aqui no Devmedia encontrei, por exemplo, cruds com este modelo. Se alguém souber onde encontrar....
GOSTEI 0
Marcos Motta

Marcos Motta

12/05/2015

Desculpe, acabei não citando a pessoa... a resposta foi para o RAndrade.
Aproveito para informar que o ambiente hoje está em PowerBuilder com SQL Server e Oracle e para ficar mais claro, segue o script de criação das tabelas acima no SQL Server.

/****** Object: Table [dbo].[empresa] ******/
CREATE TABLE [dbo].[empresa](
[id_empre] [int] NOT NULL,
[nu_princ_cnpj] [int] NOT NULL,
[nm_fanta_empre] [varchar](20) NULL,
[de_razao_socia_empre] [varchar](45) NOT NULL,
CONSTRAINT [pk_empresa] PRIMARY KEY CLUSTERED
(
[id_empre] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object: Table [dbo].[filial] ******/
CREATE TABLE [dbo].[filial](
[id_empre] [int] NOT NULL,
[id_filia] [int] NOT NULL,
[nm_filial] [varchar](25) NOT NULL,
[de_ender] [varchar](40) NULL,
[de_bairr] [varchar](20) NULL,
[de_cidad] [varchar](20) NULL,
[id_regis_estad] [varchar](6) NULL,
[nu_cep] [int] NULL,
[nu_cnpj] [decimal](14, 0) NULL,
[nu_inscr_estad] [varchar](15) NULL,
[nu_inscr_munic] [varchar](15) NULL,
[nu_ddd] [int] NULL,
[nu_telef_pabx1] [int] NULL,
[nu_telef_pabx2] [int] NULL,
[nu_telef_pabx3] [int] NULL,
[nu_fax1] [int] NULL,
[nu_fax2] [int] NULL,
[de_site] [varchar](100) NULL,
[de_mail] [varchar](100) NULL,
[st_ddr] [char](1) NULL,
CONSTRAINT [pk_filial] PRIMARY KEY CLUSTERED
(
[id_empre] ASC,
[id_filia] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object: Table [dbo].[organograma] ******/
CREATE TABLE [dbo].[organograma](
[id_empre] [int] NOT NULL,
[id_filia] [int] NOT NULL,
[id_nivel_organ] [varchar](10) NOT NULL,
[de_nivel_organ] [varchar](40) NOT NULL,
CONSTRAINT [pk_organograma] PRIMARY KEY CLUSTERED
(
[id_empre] ASC,
[id_filia] ASC,
[id_nivel_organ] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object: Table [dbo].[colaborador] ******/
CREATE TABLE [dbo].[colaborador](
[id_empre] [int] NOT NULL,
[id_filia] [int] NOT NULL,
[id_colab] [int] NOT NULL,
[id_nivel_organ] [varchar](10) NULL,
[id_cargo] [int] NOT NULL,
[nm_colab] [varchar](50) NOT NULL,
[st_vincu] [char](1) NULL,
[de_ender] [varchar](45) NULL,
[de_bairr] [varchar](20) NULL,
[de_cidad] [varchar](20) NULL,
[id_regis_estad] [varchar](6) NULL,
[nu_cep_colab] [int] NULL,
[nu_ramal_1] [int] NULL,
[nu_ramal_2] [int] NULL,
[dt_admis] [datetime] NULL,
[dt_demis] [datetime] NULL,
[vl_remun_contr] [decimal](14, 2) NULL,
[id_regis_unida_contr] [varchar](6) NULL,
[nu_telef1] [int] NULL,
[nu_telef2] [int] NULL,
[de_mail_1] [varchar](100) NULL,
[de_mail_2] [varchar](100) NULL,
[nu_ddd] [int] NULL,
[st_usuar_ad] [char](1) NULL,
[ob_colab] [varchar](2000) NULL,
CONSTRAINT [pk_colaborador] PRIMARY KEY CLUSTERED
(
[id_empre] ASC,
[id_filia] ASC,
[id_colab] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GOSTEI 0
Marcos Motta

Marcos Motta

12/05/2015

Desculpe, acabei não citando a pessoa... a resposta foi para o RAndrade.
Aproveito para informar que o ambiente hoje está em PowerBuilder com SQL Server e Oracle e para ficar mais claro, segue o script de criação das tabelas acima no SQL Server.

/****** Object:  Table [dbo].[empresa] ******/
CREATE TABLE [dbo].[empresa](
	[id_empre] [int] NOT NULL,
	[nu_princ_cnpj] [int] NOT NULL,
	[nm_fanta_empre] [varchar](20) NULL,
	[de_razao_socia_empre] [varchar](45) NOT NULL,
 CONSTRAINT [pk_empresa] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object:  Table [dbo].[filial] ******/
CREATE TABLE [dbo].[filial](
	[id_empre] [int] NOT NULL,
	[id_filia] [int] NOT NULL,
	[nm_filial] [varchar](25) NOT NULL,
	[de_ender] [varchar](40) NULL,
	[de_bairr] [varchar](20) NULL,
	[de_cidad] [varchar](20) NULL,
	[id_regis_estad] [varchar](6) NULL,
	[nu_cep] [int] NULL,
	[nu_cnpj] [decimal](14, 0) NULL,
	[nu_inscr_estad] [varchar](15) NULL,
	[nu_inscr_munic] [varchar](15) NULL,
	[nu_ddd] [int] NULL,
	[nu_telef_pabx1] [int] NULL,
	[nu_telef_pabx2] [int] NULL,
	[nu_telef_pabx3] [int] NULL,
	[nu_fax1] [int] NULL,
	[nu_fax2] [int] NULL,
	[de_site] [varchar](100) NULL,
	[de_mail] [varchar](100) NULL,
	[st_ddr] [char](1) NULL,
 CONSTRAINT [pk_filial] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC,
	[id_filia] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object:  Table [dbo].[organograma] ******/
CREATE TABLE [dbo].[organograma](
	[id_empre] [int] NOT NULL,
	[id_filia] [int] NOT NULL,
	[id_nivel_organ] [varchar](10) NOT NULL,
	[de_nivel_organ] [varchar](40) NOT NULL,
 CONSTRAINT [pk_organograma] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC,
	[id_filia] ASC,
	[id_nivel_organ] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object:  Table [dbo].[colaborador] ******/
CREATE TABLE [dbo].[colaborador](
	[id_empre] [int] NOT NULL,
	[id_filia] [int] NOT NULL,
	[id_colab] [int] NOT NULL,
	[id_nivel_organ] [varchar](10) NULL,
	[id_cargo] [int] NOT NULL,
	[nm_colab] [varchar](50) NOT NULL,
	[st_vincu] [char](1) NULL,
	[de_ender] [varchar](45) NULL,
	[de_bairr] [varchar](20) NULL,
	[de_cidad] [varchar](20) NULL,
	[id_regis_estad] [varchar](6) NULL,
	[nu_cep_colab] [int] NULL,
	[nu_ramal_1] [int] NULL,
	[nu_ramal_2] [int] NULL,
	[dt_admis] [datetime] NULL,
	[dt_demis] [datetime] NULL,
	[vl_remun_contr] [decimal](14, 2) NULL,
	[id_regis_unida_contr] [varchar](6) NULL,
	[nu_telef1] [int] NULL,
	[nu_telef2] [int] NULL,
	[de_mail_1] [varchar](100) NULL,
	[de_mail_2] [varchar](100) NULL,
	[nu_ddd] [int] NULL,
	[st_usuar_ad] [char](1) NULL,
	[ob_colab] [varchar](2000) NULL,
 CONSTRAINT [pk_colaborador] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC,
	[id_filia] ASC,
	[id_colab] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GOSTEI 0
Marcos Motta

Marcos Motta

12/05/2015

Ninguém!!!

Pessoal, alguém poderia me informar pelo menos onde eu poderia encontrar informações sobre o assunto??

Grato.

Desculpe, acabei não citando a pessoa... a resposta foi para o RAndrade.
Aproveito para informar que o ambiente hoje está em PowerBuilder com SQL Server e Oracle e para ficar mais claro, segue o script de criação das tabelas acima no SQL Server.

/****** Object:  Table [dbo].[empresa] ******/
CREATE TABLE [dbo].[empresa](
	[id_empre] [int] NOT NULL,
	[nu_princ_cnpj] [int] NOT NULL,
	[nm_fanta_empre] [varchar](20) NULL,
	[de_razao_socia_empre] [varchar](45) NOT NULL,
 CONSTRAINT [pk_empresa] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object:  Table [dbo].[filial] ******/
CREATE TABLE [dbo].[filial](
	[id_empre] [int] NOT NULL,
	[id_filia] [int] NOT NULL,
	[nm_filial] [varchar](25) NOT NULL,
	[de_ender] [varchar](40) NULL,
	[de_bairr] [varchar](20) NULL,
	[de_cidad] [varchar](20) NULL,
	[id_regis_estad] [varchar](6) NULL,
	[nu_cep] [int] NULL,
	[nu_cnpj] [decimal](14, 0) NULL,
	[nu_inscr_estad] [varchar](15) NULL,
	[nu_inscr_munic] [varchar](15) NULL,
	[nu_ddd] [int] NULL,
	[nu_telef_pabx1] [int] NULL,
	[nu_telef_pabx2] [int] NULL,
	[nu_telef_pabx3] [int] NULL,
	[nu_fax1] [int] NULL,
	[nu_fax2] [int] NULL,
	[de_site] [varchar](100) NULL,
	[de_mail] [varchar](100) NULL,
	[st_ddr] [char](1) NULL,
 CONSTRAINT [pk_filial] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC,
	[id_filia] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object:  Table [dbo].[organograma] ******/
CREATE TABLE [dbo].[organograma](
	[id_empre] [int] NOT NULL,
	[id_filia] [int] NOT NULL,
	[id_nivel_organ] [varchar](10) NOT NULL,
	[de_nivel_organ] [varchar](40) NOT NULL,
 CONSTRAINT [pk_organograma] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC,
	[id_filia] ASC,
	[id_nivel_organ] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

/****** Object:  Table [dbo].[colaborador] ******/
CREATE TABLE [dbo].[colaborador](
	[id_empre] [int] NOT NULL,
	[id_filia] [int] NOT NULL,
	[id_colab] [int] NOT NULL,
	[id_nivel_organ] [varchar](10) NULL,
	[id_cargo] [int] NOT NULL,
	[nm_colab] [varchar](50) NOT NULL,
	[st_vincu] [char](1) NULL,
	[de_ender] [varchar](45) NULL,
	[de_bairr] [varchar](20) NULL,
	[de_cidad] [varchar](20) NULL,
	[id_regis_estad] [varchar](6) NULL,
	[nu_cep_colab] [int] NULL,
	[nu_ramal_1] [int] NULL,
	[nu_ramal_2] [int] NULL,
	[dt_admis] [datetime] NULL,
	[dt_demis] [datetime] NULL,
	[vl_remun_contr] [decimal](14, 2) NULL,
	[id_regis_unida_contr] [varchar](6) NULL,
	[nu_telef1] [int] NULL,
	[nu_telef2] [int] NULL,
	[de_mail_1] [varchar](100) NULL,
	[de_mail_2] [varchar](100) NULL,
	[nu_ddd] [int] NULL,
	[st_usuar_ad] [char](1) NULL,
	[ob_colab] [varchar](2000) NULL,
 CONSTRAINT [pk_colaborador] PRIMARY KEY CLUSTERED 
(
	[id_empre] ASC,
	[id_filia] ASC,
	[id_colab] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GOSTEI 0
Marcos P

Marcos P

12/05/2015

Marcos,

Não posso lhe indicar maiores referências de pesquisa, mas posso lhe dar um conselho : entenda ( realmente ) o conceito de relacionamento dos modelos mais simples.

Quando você realmente entender isso, derivar a modelagem para requisitos mais complexos ( como por exemplo, multi-empresas, multi-filial, multi-local, multi-idioma, etc... ) será, simplesmente, uma evolução natural do processo, onde você terá de trabalhar com mais tabelas por conta de uma ambiente mais complexo.

Só isso !

Por exemplo : uma relação de itens x compras simples, é a base para você implementar uma relação de itens x compras em um sistema multi-empresas. A diferença é que você terá algumas tabelas adicionais para acomodar esse relacionamento e uma aplicação com um nível maior de complexidade para tratar esse nível de detalhamento.

Modelagem é a melhor maneira de demonstrar conhecimento sobre o negócio que está sendo modelado, portanto, conheça o negócio antes de iniciar um processo de modelagem mais complexo.

Quanto a modelos genéricos, que, sinceramente, podem servir apenas como referência, dê uma olhada em : Industry Data Models
GOSTEI 0
Marcos Motta

Marcos Motta

12/05/2015

Obrigado pela resposta Marcos P,

Realmente não entendi se você compreendeu o problema que gerou o post, não se trata de uma questão de modelagem, o sistema já existe a bastante tempo e a modelagem do banco de dados atende ao sistema desde sempre.

O problema é relativo à adequação do modelo atual a uma abordagem orientada a objeto, pois a intenção, até agora, é manter o modelo intacto.

A dúvida era sobre a possibilidade de usar ou não classe Id, e se existiria outra abordagem dentro do universo java que permitisse a utilização do banco em sua estrutura atual ou com o mínimo de alterações (daí postar o modo de criação das tabelas que citei no primeiro post).

Se o modelo atual está em conformidade com a melhor abordagem relacional ?!?!? Há discordâncias desde sempre !!! Mas não haverá mudanças radicais neste momento, daí o fato de as respostas acima, que suscitaram o uso de chaves simples, não resolverem o problema.

Obrigado pelo link, é realmente interessante visualizar as soluções para relacionamento de tabelas, mas não é esse o caso.

Grato.


Marcos,

Não posso lhe indicar maiores referências de pesquisa, mas posso lhe dar um conselho : entenda ( realmente ) o conceito de relacionamento dos modelos mais simples.

Quando você realmente entender isso, derivar a modelagem para requisitos mais complexos ( como por exemplo, multi-empresas, multi-filial, multi-local, multi-idioma, etc... ) será, simplesmente, uma evolução natural do processo, onde você terá de trabalhar com mais tabelas por conta de uma ambiente mais complexo.

Só isso !

Por exemplo : uma relação de itens x compras simples, é a base para você implementar uma relação de itens x compras em um sistema multi-empresas. A diferença é que você terá algumas tabelas adicionais para acomodar esse relacionamento e uma aplicação com um nível maior de complexidade para tratar esse nível de detalhamento.

Modelagem é a melhor maneira de demonstrar conhecimento sobre o negócio que está sendo modelado, portanto, conheça o negócio antes de iniciar um processo de modelagem mais complexo.

Quanto a modelos genéricos, que, sinceramente, podem servir apenas como referência, dê uma olhada em : Industry Data Models
GOSTEI 0
POSTAR