Relacionamento N:N

13 respostas
SandroSoftwares

Boa noite a todos!

Preciso tirar essa dúvida com os colegas:

Tenho duas tabelas: Uma de Serviços e outra de Pessoas:

Esse é um tipo de relacionamento n:n uma vez que um serviço pode ser de várias pessoas e uma pessoa pode ter vários serviços!

Como relacionamentos n:n precisam de uma tabela auxiliar, criei-a:

CREATE TABLE Pessoas_Servicos (

Pessoa_idPessoa INTEGER UNSIGNED NOT NULL,

Servico_idServico INTEGER UNSIGNED NOT NULL,

PRIMARY KEY(Pessoa_idPessoa, Servico_idServico),

INDEX Pessoas_Servicos_FKIndex1(Pessoa_idPessoa),

INDEX Pessoas_Servicos_FKIndex2(Servico_idServico)

);

Aqui há um relacionamento que tem duas chaves primária, sendo que não há chaves estrangeiras.

A dúvida é: Eu tô equivocado ou não há como controlar a inserção no banco de ids que ainda não foram cadastrados?

por exemplo:

eu tenho aqui 2 pessoas cadastradas (idPessoa = 01 e idPessoa = 02) e 1 serviço cadastrado (idServico = 1);

tô testando aqui essa string sql e ele aceita normalmente:

insert into Pessoas_Servicos (Pessoa_idPessoa, Servico_idServico) values(3,1)

aceitou normal… como pode se eu não tenho a pessoa 3 ainda cadastrada?

só vou conseguir controlar isso via aplicação?

13 Respostas

pmlm

http://en.wikipedia.org/wiki/Foreign_key

SandroSoftwares

pmlm

Não sei se sua intenção foi ajudar ou não mas em N:N não há a Foreign_key sugerida…

pmlm

Na tabela Pessoas_servicos, tens de criar 2 Foreign Keys.
Uma em Pessoa_idPessoa, que aponta para o id da tabela Pessoa e outra em Servico_idServico, que aponta para o id da tabela Servico.

SandroSoftwares

então o correto seria consultar via aplicativo se aquele id existe antes de inserir?

(Essa é a dúvida, se tenho que fazer uma consulta ao banco antes da inserção via aplicativo para consultar se o id existe para somente depois inserir:
insert into Pessoas_Servicos (Pessoa_idPessoa, Servico_idServico) values(3,1)

é assim mesmo que se procede ou tem outra forma?
)

SandroSoftwares

ou tem algo que o banco possa fazer para perceber que o idPessoa = 3 não existe? sem precisar de minha intervenção?

pmlm

Se criares as FK como disse acima, vai dar erro se inserires o idPessoa = 3 tal como pretendes

SandroSoftwares

eu acho que sou eu quem não estou compreendendo direito…

eu já li diversas vezes hoje que o relacionamento N:N gera uma nova tabela e que esta tabela não tem chave estrangeira…

eu também acho que se eu colocasse as duas chaves estrangeiras seria mais correto…

mas…

vou tentar aqui…

pmlm

O relacionamento N:N não tem chave estrangeira entre as duas tabelas que se relacionam. Mas tem entre cada uma das tabelas e a tabela auxiliar.

SandroSoftwares

recortei o que está em vermelho e rodou…

CREATE TABLE Pessoas_Servicos (

Pessoa_idPessoa INTEGER UNSIGNED NOT NULL,

Servico_idServico INTEGER UNSIGNED NOT NULL,

[color=red]PRIMARY KEY(Pessoa_idPessoa, Servico_idServico), [/color]

INDEX Pessoas_Servicos_FKIndex1(Pessoa_idPessoa),

INDEX Pessoas_Servicos_FKIndex2(Servico_idServico)

);

vou testar a implementação via aplicativo

SandroSoftwares

testei via aplicativo e inseri um id de uma pessoa ainda não cadastrada e aceitou… como pode isso?

alguém que já tenha trabalhado com este relacionamento n:n pode me confirmar se primeiro eu tenho que conferir se existe o id pra depois (e somente depois) gravar?

SandroSoftwares

Fiz um teste aqui numa tabela que tem um relacionamento 1:n e inseri uma FK que não existia ainda na tabela de origem e aceitou…

eu devo ter me confundido pensando que não aceitava (e na minha opinião ainda é um erro pois se na tabela de origem não existe como pode aceitar como referência?)

o jeito é esse: vou fazer a consulta antes de gravar para ver se existe a FK. Se não existir não deixo gravar…

aguardo outras opiniões se alguém tiver!

pmlm

Ainda não criaste nenhuma FK.

SandroSoftwares

este foi justamente meu erro…

Eu tinha criado as tabelas e fui implementando na mão só que me esqueci das referências!!!
Eu colocava a cheva estrangeira onde queria usa-la porém sem referência complicou-se!

valeu pmlm!

:smiley: :smiley: :smiley:

Criado 30 de julho de 2011
Ultima resposta 2 de ago. de 2011
Respostas 13
Participantes 2