Problemas com relacionamento N:N

11/04/2016

0

Olá pessoal tudo bem, sou novo no Fórum, e vim pedir auxilio dos senhores, no que diz respeito a relacionamento muitos-para-muitos.
Bom estou criando um banco de dados para o meu TCC e estou travando na seguinte questão:
Tenho a seguintes estrutura de banco de dados abaixo.

create table marca_arma(id serial,
marca_arma varchar(50),
primary key (id));



create table tipo_arma(id serial,
tipo_arma varchar(50),
primary key (id));



create table tipo_marca(tipo_id int,
marca_id int,
primary key (tipo_id, marca_id),
foreign key (tipo_id)references tipo_arma(id),
foreign key (marca_id)references marca_arma(id))



create table calibre_arma(id serial,
calibre_arma char(6),
primary key (id));



create table modelo_arma(id serial,
modelo_arma varchar(50),
calibre_id int,
marca_id int,
primary key (id),
foreign key (calibre_id)references calibre_arma(id),
foreign key (marca_id)references marca_arma(id));


Bom o que eu pretendo com isso. Em meu projeto quando eu precisar listar todas as armas que tenho em meu banco de dados, teria que aparecer dessa maneira.

Tipo Marca Modelo Calibre
Revolver Rossi R22 .22
Pistola Taurus 640 .380
Pistola Taurus 940 .40
Fuzil FAL M1960 7,62mm

etc.....

O que acontece que quando tento fazer a pesquisa com select, ele busca todos os dados, porém mistura eles.

Se alguem puder me dar um auxilio de como fazer essa busca, agradeço desde já.
Pablo Weber

Pablo Weber

Responder

Post mais votado

11/04/2016

Teste assim:

---drop table marca_arma;
create table marca_arma(
	id_marca_arma serial,
	ds_marca_arma varchar(50)
);
---drop table tipo_marca;
create table tipo_marca(
	id_tipo_arma int,
	id_marca_arma int
);
---drop table tipo_arma;
create table tipo_arma(
	id_tipo_arma serial,
	ds_tipo_arma varchar(50)
);
---drop table modelo_arma;
create table modelo_arma(
	id_modelo_arma serial,
	ds_modelo_arma varchar(50),
	id_calibre_arma int,
	id_marca_arma int
);
---drop table calibre_arma;
create table calibre_arma(
	id_calibre_arma serial,
	ds_calibre_arma char(6)
);

select 
	ti.ds_tipo_arma, 
	ma.ds_marca_arma, 
	mo.ds_modelo_arma, 
	ca.ds_calibre_arma 
from
	tipo_arma ti
left join tipo_marca tm on (tm.id_tipo_arma = ti.id_tipo_arma)
left join marca_arma ma on (ma.id_marca_arma = tm.id_marca_arma)
left join modelo_arma mo on (mo.id_marca_arma = ma.id_marca_arma)
left join calibre_arma ca on (ca.id_calibre_arma = mo.id_calibre_arma)
order by
	ti.ds_tipo_arma, 
	ma.ds_marca_arma, 
	mo.ds_modelo_arma, 
	ca.ds_calibre_arma;


Tirei as FKs e PKs pra fazer mais rapido.

Raylan Zibel

Raylan Zibel
Responder

Mais Posts

11/04/2016

Raylan Zibel

Mostra o SQL que está usando e, se possível, um printscreen do resultado.
Responder

11/04/2016

Pablo Weber

Ok, amigo, vou testar agora e já lhe dou o retorno.
Responder

11/04/2016

Pablo Weber

Testei aqui Raylan, e o resultado é esse.
[img:descricao=Resultado do select proposto]http://arquivo.devmedia.com.br/forum/imagem/485245-20160411-160938.png[/img]

Só que se você perceber, ele repetiu os dados da Pistola modelo 640 e 940.

O que pode ter acontecido?
Responder

11/04/2016

Raylan Zibel

Tente:

select distinct 
    ti.ds_tipo_arma, 
    ma.ds_marca_arma, 
    mo.ds_modelo_arma, 
    ca.ds_calibre_arma 
from
    tipo_arma ti
left join tipo_marca tm on (tm.id_tipo_arma = ti.id_tipo_arma)
left join marca_arma ma on (ma.id_marca_arma = tm.id_marca_arma)
left join modelo_arma mo on (mo.id_marca_arma = ma.id_marca_arma)
left join calibre_arma ca on (ca.id_calibre_arma = mo.id_calibre_arma)
order by
    ti.ds_tipo_arma, 
    ma.ds_marca_arma, 
    mo.ds_modelo_arma, 
    ca.ds_calibre_arma;
Responder

11/04/2016

Pablo Weber

Bah, show de bola, a principio deu tudo certo, vou fazer mais algumas inserções e ver se ocorre tudo certo, e já lhe dou o retorno.
Responder

11/04/2016

Pablo Weber

Amigo Raylan, tudo certo cara, show de bola mesmo heim. Tu é o cara.
Mas se puderes me tira uma dúvida, a tabela tipo_marca possui as chaves primarias da tabela tipo_arma e marca_arma, correto?
Elas não deveriam ser primárias e estrangeiras ao mesmo tempo, não é isso o que torna a relação n:n?
Responder

11/04/2016

Raylan Zibel

Funciona sem criar PK e FK. Mas o correto é criar um indice unico pra elas e criar as chaves estrangeiras. Fazer a integridade referencial corretamente.
Responder

11/04/2016

Pablo Weber

Tá OK, mas e se eu colocar na tabela tipo_marca os id como PK e FK, funciona também como o seu esquema? Porque como eu fazia não dava certo.
Responder

11/04/2016

Raylan Zibel

Sim.
Responder

11/04/2016

Pablo Weber

Valeu meu amigo, espero também poder ajudar outras pessoas quando eu tiver esse seu conhecimento. Bom por hora muito obrigado a você e ao Fórum pelo espaço.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar