Chaves compostas - Melhor solução
12/05/2015
0
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
Posts
12/05/2015
Marcos Motta
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
.....
12/05/2015
Randrade
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:
---------------
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.
12/05/2015
Marisiana Battistella
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 .....
14/05/2015
Ronaldo Lanhellas
colaborador --------------- id_colaborador (pk) id_filial (fk) nm_colaborador ..... cria uma chave única (uk) = id_colaborador, id_filial
14/05/2015
Ronaldo Lanhellas
colaborador --------------- id_colaborador (pk) id_filial (fk) nm_colaborador ..... cria uma chave única (uk) = id_colaborador, id_filial
14/05/2015
Marcos Motta
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....
14/05/2015
Marcos Motta
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]
14/05/2015
Marcos Motta
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]
21/05/2015
Marcos Motta
Pessoal, alguém poderia me informar pelo menos onde eu poderia encontrar informações sobre o assunto??
Grato.
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]
21/05/2015
Marcos P
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
21/05/2015
Marcos Motta
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.
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
Clique aqui para fazer login e interagir na Comunidade :)