Jump to content


Photo

Chave Estrangeira


  • Faça o login para participar
10 replies to this topic

#1 gersonab

gersonab

    Normal

  • Usuários
  • 113 posts
  • Sexo:Não informado

Posted 01/09/2009, 22:00

Bom noite a todos.
tenho 2 tabelas, chamadas produto e analise da seguinte forma:

produto
id_prod
produto_prod
fab_prod
analise_prod

analise
id_an
analise_an
met_an
unid_an
esp_an

cada produto pode ter várias análises, até aí beleza, cadastro o produto e escolho as análises referente a este, podendo variar de 2 a 30 , para um total de 104.

A minha dificuldade esta em listar as analises de um determinado produto, exemplo:

produto
id_prod - 1 - 2 - 3 - 4
produto_prod - 01 - 02 - 03 - 04
fab_prod - 11 - 12 - 13 - 14
analise_prod - 1,2,4 - 2,3 - 2,3 - 2,4 ( aqui eu guardo o id da analise )

analise
id_an - 1 - 2 - 3 - 4
analise_an - 61 - 62 - 63 - 64
met_an - a - b - c - d
unid_an - g - h - i - j
esp_an - m - n - o - p

Levando em conta que tenho 4 analises cadastradas e 4 produtos com suas respectivas analises , não estou conseguindo listar que o produto 01 tem as analises 1,2,4 , isto é, ficando assim :

id_prod / produto_prod
---1----/-----01------
id_an / analise_an / met_an / unid_an / esp_an
--1---/----61------/---a----/---g-----/---m---
--2---/----62------/---b----/---h-----/---n---
--4---/----64------/---d----/---j-----/---p---

em outras palavras ----> o produto 01 vai fazer as analises 61, 62 e 64 com seus respectivos dados.

caso escolha outro produto :

id_prod / produto_prod
---3----/-----03------
id_an / analise_an / met_an / unid_an / esp_an
--2---/----62------/---b----/---h-----/---n---
--3---/----63------/---c----/---i-----/---o---

em outras palavras ----> o produto 03 vai fazer as analises 62 e 63 com seus respectivos dados.

Aí, eu andei estudando sobre chave estrangeira, montei a seguinte tabela:
CREATE TABLE produtoanalise (
id_produto INT (5) NULL,
id_analise INT (5) NULL,
PRIMARY KEY (id_produto, id_analise),
FOREIGN KEY (id_produto) REFERENCES `produto`(id_prod),
FOREIGN KEY (id_analise) REFERENCES `analise`(id_an)ON DELETE CASCADE ON UPDATE CASCADE);

Só que não estou conseguindo dizer que:

id_produto - id_analise
---- 1 --------/----- 1 ------
---- 1 --------/----- 2 ------
---- 1 --------/----- 4 ------
como definido no peimeiro exemplo.

Para cadastrar editar , esta beleza , faço o cadastro de varias analises de uma vez ao cadastrar o produto.
Desde já agradeço a ajuda de todos e peço desculpa pelo post longo, apenas tentei detalhar minha dúvida para uma melhor compreenção.

#2 viniciusweb

viniciusweb

    Novato no fórum

  • Usuários
  • 16 posts
  • Sexo:Não informado

Posted 02/09/2009, 01:50

Não ficou claro pra mim se uma análise pode estar associada à mais de um produto. Se não puder, a solução é criar um campo "id_produto" na tabela "analise". Você só cria uma outra tabela quando o relacionamento for "de muitos para muitos", ou seja, se uma análise puder estar associada a vários produtos e um produto puder ter várias análises.

Se eu tiver entendido errado e realmente uma análise puder ser associada à mais de um produto, então para listar as análises de um produto basta fazer o select:

SELECT analise.id_an, analise.analise_an, analise.met_an FROM analise WHERE id_produto = 1;


#3 gersonab

gersonab

    Normal

  • Usuários
  • 113 posts
  • Sexo:Não informado

Posted 02/09/2009, 02:09

vinicius, Bom DIA.
Tanto a mesma analise pode ter varios produtos , quanto um produto tera varias analises , é muitos para muitos mesmo.
Melhorando o exemplo :
id_produto - id_analise
---- 1 --------/----- 1 ------
---- 1 --------/----- 2 ------
---- 1 --------/----- 4 ------
---- 2 --------/----- 2 ------
---- 2 --------/----- 3 ------
---- 3 --------/----- 1 ------
---- 3 --------/----- 4 ------

Eu não estou conseguindo justamente fazer isso, completar esta tabela.

#4 viniciusweb

viniciusweb

    Novato no fórum

  • Usuários
  • 16 posts
  • Sexo:Não informado

Posted 02/09/2009, 02:14

Você disse "Para cadastrar editar , esta beleza , faço o cadastro de varias analises de uma vez ao cadastrar o produto." e eu postei o SQL pra selecionar. Não entendi qual sua dúvida agora.

#5 gersonab

gersonab

    Normal

  • Usuários
  • 113 posts
  • Sexo:Não informado

Posted 02/09/2009, 15:15

Vamos lá... desde já agradeço a ajuda.

Pelo que andei lendo na internet sobre chave estrangeira e relacionamento entre tabelas , entendo que :

No meu caso é do tipo muitos para muitos, pois uma analise pode ter varios produtos , quanto um produto tera varias analises , certo.
logo conforme o entendimento que tive teria de fazer uma mudança na minha tabela produtos, tirando a coluna analise, ficando desta forma :
id_prod - produto_prod - fab_prod

Mantendo a tabela analise como estava e criando a tabela de chaves estrangeiras onde guardaria os ids relacionados.
id_produto - id_analise
- id_prod ------ id_an -

quando eu falei que estava cadastrando e editando sem problema , estava cadastrando os id's das analises na coluna analise_pro da tabela produtos , logo como eu retirei esta coluna , aí vem a dúvida que eu realmente não consegui entender como fazer até agora , pois ao cadastrar um produto eu preciso cadastrar varias analises para este.

Aí é que esta o problema, como cadastrar desta foram?

#6 viniciusweb

viniciusweb

    Novato no fórum

  • Usuários
  • 16 posts
  • Sexo:Não informado

Posted 02/09/2009, 15:21

Insere primeiro na tabela de produtos, depois usa a função mysql_insert_id para pegar o id do produto que foi cadastrado e usa esse id para inserir na tabela de relacionamento "produtoanalise".

#7 nvivo

nvivo
  • Visitantes

Posted 02/09/2009, 15:25

quando eu falei que estava cadastrando e editando sem problema , estava cadastrando os id's das analises na coluna analise_pro da tabela produtos , logo como eu retirei esta coluna , aí vem a dúvida que eu realmente não consegui entender como fazer até agora , pois ao cadastrar um produto eu preciso cadastrar varias analises para este.

Aí é que esta o problema, como cadastrar desta foram?


Gerson,

A sua análise está correta. É necessário uma tabela de "junção" pra normalizar esse relacionamento, como você descreveu.

A operação envolve vários inserts em vez de um só, e é uma boa você utilizar transactions nesse processo.

Então, considerando que você tem as tabelas A, B e AB (sendo essa a que representa o relacionamento N para N), a idéia é:

1. Inserir ou certificar-se que você tem o registro na tabela A,
2. Inserir ou certificar-se que você tem o registro na tabela B,
3. Inserir os relacionamentos na tabela AB.

Era esta a sua dúvida?

[]'s

#8 gersonab

gersonab

    Normal

  • Usuários
  • 113 posts
  • Sexo:Não informado

Posted 02/09/2009, 15:55

bom, ja começou a clarear o céu, previsão de tempo bom para o feriado ... rs....

Vamos para a lógica da situação.

1 - inserir as analises na tabela analise.
2 - inserir os produtos na tabela produto.
3 - relacionar o produto com sua analise na tabela analiseproduto.

resumindo, eu teria podemos dizer 3 etapas distintas, correto , ou pelo menos como falei ja deu uma clareada boa.

vou trb neste e mais tarde eu posto como ficou.

#9 nvivo

nvivo
  • Visitantes

Posted 02/09/2009, 16:22

Vamos para a lógica da situação.

1 - inserir as analises na tabela analise.
2 - inserir os produtos na tabela produto.
3 - relacionar o produto com sua analise na tabela analiseproduto.

resumindo, eu teria podemos dizer 3 etapas distintas, correto , ou pelo menos como falei ja deu uma clareada boa.

vou trb neste e mais tarde eu posto como ficou.


Isso! Recomendo que você utilize transactions, pois com elas você garante que a operação inteira seja atômica.

Ou seja, caso você tenha inserido a análise e o produto, mas dê um erro na inserção do relacionamento, é possível "desfazer tudo" e voltar para o estado inicial.

Qualquer coisa, estamos aí.

[]'s

#10 gersonab

gersonab

    Normal

  • Usuários
  • 113 posts
  • Sexo:Não informado

Posted 07/09/2009, 13:44

Grandes, boa tarde.
Fiz um pouco diferente:
1 - cadastro as analises
2 - cadastro os produtos
3 - escolho o produto que quero cadastrar analise e cadastro as devidas analises .

Até ai tudo beleza, mas não to conseguindo listar as analises pelo produto, isto é, seleciono um produto e listo as analises que pertencem a este.

Já tentei de várias formas ....

#11 MarcoviZ

MarcoviZ

    ubuntu for human being

  • Usuários
  • 1137 posts
  • Sexo:Não informado

Posted 07/09/2009, 19:27

ok, vou fazer um esboço:

Tabelas:
Produto - Relacionamento - Analise
contando que o relacionamento tem que possuir o codigo do produto e o codigo da analise:

SELECT a.analise FROM analise a, produto p, relacionamento r WHERE a.codigo = r.codigo_analise AND r.codigo_produto = p.codigo AND p.codigo = X

o a.codigo é o código da análise na tabela ANALISE, o r.codigo_analise é o código da análise na tabela que relaciona, r.codigo_produto é o codigo do produto na tabela de relacionamento e p.codigo é o codigo do produto na tabela produto.

fazendo isso ele vai buscar a analise onde o código do produto é X

qualquer dúvida é só falar.


[]'s
[]'s




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq