Chave composta ou apenas Foreign key | com qual seriamelhor para trabalhar?

Galera… para os que manjam bem de DB…

Estou usando o bando de dados Firebird e Hibernate para controle entre DB e Aplicaçao…

Na propria documentaçao do Hibernate não recomenda o uso de chaves compostas, mais isso n signica que n funcione…

Como seria melhor uso para mapeamento e criaçao de tabelas que precisam de dados de outras tabelas:

  • Criando chave composta (Na TABELA INGERDIENTE) , por exemplo:

CREATE TABLE UNIDADE(
  ID_UNIDADE Integer NOT NULL,
  DESCRICAO Varchar(45) NOT NULL,
  SIGLA_UNIDADE Varchar(20) NOT NULL,
  PRIMARY KEY (ID_UNIDADE)
);

CREATE TABLE INGREDIENTE(
  ID_INGREDIENTE Integer NOT NULL,
  ID_UNIDADE Integer NOT NULL,
  DESCRICAO Varchar(45) NOT NULL,
  QUANT_ESTOQUE Numeric(15,2) NOT NULL,
  QUANT_SAIDA Numeric(15,2) NOT NULL,
  [b]PRIMARY KEY (ID_INGREDIENTE, ID_UNIDADE)[/b]
);

ALTER TABLE INGREDIENTE ADD CONSTRAINT FK_INGREDIENTE_1
  FOREIGN KEY (ID_UNIDADE) REFERENCES UNIDADE (ID_UNIDADE) ON UPDATE NO ACTION ON DELETE NO ACTION;

OU Apenas criando uma foreign key, como mostrado abaixo…


CREATE TABLE UNIDADE(
  ID_UNIDADE Integer NOT NULL,
  DESCRICAO Varchar(45) NOT NULL,
  SIGLA_UNIDADE Varchar(20) NOT NULL,
  PRIMARY KEY (ID_UNIDADE)
);

CREATE TABLE INGREDIENTE(
  ID_INGREDIENTE Integer NOT NULL,
  ID_UNIDADE Integer NOT NULL,
  DESCRICAO Varchar(45) NOT NULL,
  QUANT_ESTOQUE Numeric(15,2) NOT NULL,
  QUANT_SAIDA Numeric(15,2) NOT NULL,
  [b]PRIMARY KEY (ID_INGREDIENTE)[/b]
);

ALTER TABLE INGREDIENTE ADD CONSTRAINT FK_INGREDIENTE_1
  FOREIGN KEY (ID_UNIDADE) REFERENCES UNIDADE (ID_UNIDADE) ON UPDATE NO ACTION ON DELETE NO ACTION;

Qual das formas seria melhor para trabalhar, levando em conta mapeamentos com Hibernate.

Abraços…

Cara, já que o Hibernate te recomenda não usar e, ao meu ver, Foreign Key é a melhor solução, use Foreign Key’s!

Até por que não entendi muito porque você compara as duas. Afinal, usar uma chave composta vai garantir apenas que existirá um ingrediente para uma medida, sempre. Usando Foreign Key você estará garantindo que a unidade escolhida existe no cadastro de unidades, coisa que a primeira opção não faria.

Não sei se entendi bem o que você expôs.

Acredito que faria diferença de as FK fossem PK.
Ou seja um Igrediente fosse identificado somente pelas FK.

poise… se eu trabalhar com a FK sendo tambem PK, eu taria trabalhando com chave composta… o que n eh recomendando no Hibernate!

Eita sinuca danada essa! Com qual das formas eh melhor de trabalhar???

xD

root_, seguinte…

Primeiro vc tem que pensar na sua regra de negócio.

O que é uma chave composta?
Se vc tem dois campos como chave primária
(ID_INGREDIENTE, ID_UNIDADE), significa
que vc não poderá repetir registros com
os DOIS campos idênticos, ou seja, vc pode repetir
só o ID_INGREDIENTE em alguns registros sem
problema nenhum, OU pode também repetir o
ID_UNIDADE em alguns registros, sem problema,
DESDE que não repita OS DOIS valores em dois
registros diferentes.

Se vc deixar somente o ID_INGREDIENTE como chave
primária, então, vc não poderá repetir o valor desse
campo NUNCA, ele será único.

Portanto, vai da sua regra de negócio!
Se vc trocar o valor de ID_UNIDADE, vc
pode repetir o ID_INGREDIENTE? Se a resposta
for SIM, então o ID_INGREDIENTE não pode
ser uma chave primária sozinho…

Eu particularmente NUNCA crio chaves compostas,
eu não gosto desse modelo.
Se a minha tabela não tem um campo que seja
único (no seu caso, o ID_INGREDIENTE, é único
ou não??), então eu crio um campo a mais e uso
como código da tabela. E imagino que seja isso
que o Hibernate sugere!!

Hum… otimo esclarecimento MiltonBastos.
entao deixarei apenas como PK o ID_INGREDIENTE e ID_UNIDADE como apenas FK.

xD

vlw aew

MAIS UMA DUVIDA:
pode-se trabalhar com o hibernate sem usar PK,
tipo, tenho uma tabela chamada ENTRADA_INGREDIENTE que eh criada dessa forma:

CREATE TABLE ENTRADA_INGREDIENTE (
  ID_INGREDIENTE INTEGER NOT NULL,
  ID_UNIDADE INTEGER NOT NULL,
  DATA_ENTRADA DATE NOT NULL,
  QUANTIDADE_ENTRADA NUMERIC(15,2) NOT NULL,
  FOREIGN KEY(ID_INGREDIENTE) REFERENCES INGREDIENTE(ID_INGREDIENTE),
  FOREIGN KEY(ID_UNIDADE) REFERENCES UNIDADE(ID_UNIDADE) 
);

O problema é que n da pra fazer desses 2 IDs como chave composta pq eles pode repetir varias vezes!

Pode-se trabalhar no hibernate dessa forma? sem o uso de uma chave primaria?

Ah, sobre o Hibernate, infelizmente não vou poder te ajudar!
Não conheço absolutamente NADA sobre hibernate… rs…