Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Relacionamento N:N


edersonnves

Pergunta

vou enumerar as perguntas para ficar mais claro:

tenho um relacionamento n:n onde numa ocorrencia poderá conter varios agentes ou infratores, e agentes ou infratores poderá ter varias ocorrencias.

com esses campos

BOL_OCORRENCIA (N_BOP, DATA_OC, HI_OC, HF_OC, ENDERECO_OC, COMPL_OC, BAIRRO_OC, CIDADE_OC, ESTADO_OC, ID_GUARN)

AGENTE_INFRATOR(ID_AG_INF, NOME_AG_INF, DT_NASCIMENTO_AG_INF, N_MAE_AG_INF, N_PAI_AG_INF, R_N_CASA_AG_INF, COMPL_AG_INF, BAIRRO_AG_INF, CIDADE_AG_INF, ESTADO_AG_INF, T_DOC_AG_INF, N_DOC_AG_INF, O_EXP_AG_INF, UF_AG_INF, COND_FIS_AGENTE_INF, ARM_OBJ_APREEN_AG_INF, PERT_AG_INF)

perguntas

1)tenho que criar uma terceira tabela?

se sim se esta correto dessa maneira

BOL_OCORRENCIA (N_BOP, DATA_OC, HI_OC, HF_OC, ENDERECO_OC, COMPL_OC, BAIRRO_OC, CIDADE_OC, ESTADO_OC, ID_GUARN)

AGENTE_INFRATOR(ID_AG_INF, NOME_AG_INF, DT_NASCIMENTO_AG_INF, N_MAE_AG_INF, N_PAI_AG_INF, R_N_CASA_AG_INF, COMPL_AG_INF, BAIRRO_AG_INF, CIDADE_AG_INF, ESTADO_AG_INF, T_DOC_AG_INF, N_DOC_AG_INF, O_EXP_AG_INF, UF_AG_INF, COND_FIS_AGENTE_INF, ARM_OBJ_APREEN_AG_INF, PERT_AG_INF)

PODE TER(N_BOP, ID_AG_INF, NOME_AG_INF);

N_BOP REFERENCIA BOL_OCORRENCIA

ID_AG_INF, NOME_AG_INF REFERENCIA AGENTE_INFRATOR

2) se estiver correto, se nessa nova tabela PODETER os campos serão chaves primarias, chaves estrangeiras ou serão os dois? se for os dois como é a forma de criação?

3) como vou fazer para inserir os dados dai nessa tabela PODETER? manualmente, ou tem alguma forma de inserir automatico, já que os dados já vao ser inserido nas tabelas BOL_OCORRENCIA, AGENTE_INFRATOR.

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 1

Oi, 'edersonnves'!

Esclarecendo suas dúvidas, temos:

tenho um relacionamento n:n onde numa ocorrencia poderá conter varios agentes ou infratores, e agentes ou infratores poderá ter varias ocorrencias.

com esses campos

BOL_OCORRENCIA (N_BOP, DATA_OC, HI_OC, HF_OC, ENDERECO_OC, COMPL_OC, BAIRRO_OC, CIDADE_OC, ESTADO_OC, ID_GUARN)

AGENTE_INFRATOR(ID_AG_INF, NOME_AG_INF, DT_NASCIMENTO_AG_INF, N_MAE_AG_INF, N_PAI_AG_INF, R_N_CASA_AG_INF, COMPL_AG_INF, BAIRRO_AG_INF, CIDADE_AG_INF, ESTADO_AG_INF, T_DOC_AG_INF, N_DOC_AG_INF, O_EXP_AG_INF, UF_AG_INF, COND_FIS_AGENTE_INF, ARM_OBJ_APREEN_AG_INF, PERT_AG_INF)

Na tabela AGENTE_INFRATOR, a chave primária deveria ser somente ID_AG_INF

1)tenho que criar uma terceira tabela?
Sim. Um relacionamento muitos para muitos sempre gera uma terceira tabela, pois no modelo físico só conseguimos representar o relacionamento 1:N. Então, com a terceira tabela teríamos 1:N N:1, que é igual a M:N(muitos para muitos).

se sim se esta correto dessa maneira

BOL_OCORRENCIA (N_BOP, DATA_OC, HI_OC, HF_OC, ENDERECO_OC, COMPL_OC, BAIRRO_OC, CIDADE_OC, ESTADO_OC, ID_GUARN)

AGENTE_INFRATOR(ID_AG_INF, NOME_AG_INF, DT_NASCIMENTO_AG_INF, N_MAE_AG_INF, N_PAI_AG_INF, R_N_CASA_AG_INF, COMPL_AG_INF, BAIRRO_AG_INF, CIDADE_AG_INF, ESTADO_AG_INF, T_DOC_AG_INF, N_DOC_AG_INF, O_EXP_AG_INF, UF_AG_INF, COND_FIS_AGENTE_INF, ARM_OBJ_APREEN_AG_INF, PERT_AG_INF)

PODE TER(N_BOP, ID_AG_INF, NOME_AG_INF);

N_BOP REFERENCIA BOL_OCORRENCIA

ID_AG_INF, NOME_AG_INF REFERENCIA AGENTE_INFRATOR

Eu não colocaria o atributo NOME_AG_INF na tabela PODE_TER e trocaria o nome dela para algo mais prático e de fácil documentação, tal como RL_OCORRENCIA_AG_INFRATOR. O RL é uma abreviação para RELACIONAMENTO.

2) se estiver correto, se nessa nova tabela PODETER os campos serão chaves primarias, chaves estrangeiras ou serão os dois? se for os dois como é a forma de criação?
Sim. Dependendo do modelo que você está criando. seria mais ou menos assim:
CREATE RL_OCORRENCIA_AG_INFRATOR (
   N_BOP <o tipo do dado igual a tabela BOL_OCORRENCIA>, 
   ID_AG_INF <o tipo do dado igual a tabela AGENTE_INFRATOR>, 
   PRIMARY KEY (N_BOP, ID_AG_INF),
   CONSTRAINT FK_RL_OCOR_AG_INFRATOR_001 FOREIGN KEY (N_BOP) REFERENCES BOL_OCORRENCIA (N_BOP) 
      ON DELETE NO ACTION ON UPDATE NO ACTION,
   CONSTRAINT FK_RL_OCOR_AG_INFRATOR_002 FOREIGN KEY (ID_AG_INF ) REFERENCES AGENTE_INFRATOR (ID_AG_INF ) 
      ON DELETE NO ACTION ON UPDATE NO ACTION,
);

3) como vou fazer para inserir os dados dai nessa tabela PODETER? manualmente, ou tem alguma forma de inserir automatico, já que os dados já vao ser inserido nas tabelas BOL_OCORRENCIA, AGENTE_INFRATOR.

Eu usaria uma Storage procedure que seria disparada em meu programa após a inserção dos dados da ocorrencia e do agente infrator.

Link para o comentário
Compartilhar em outros sites

  • 0
voce poderia me dar algum exemplo de como eu uso essa Storage procedure.

Seria mais ou menos assim: Onde test é o nome do meu banco de testes.

DELIMITER $$;

DROP PROCEDURE IF EXISTS `test`.`Grava`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Grava`(pN_BOP integer, pID_AG_INF integer)
BEGIN
   INSERT INTO RL_OCORRENCIA_AG_INFRATOR (N_BOP, ID_AG_INF)
   VALUES (pN_BOP, pID_AG_INF);
END$$

DELIMITER;$$
para chamar a SP use
CALL Grava(<variavel com valor de N_BOP>, <variavel com valor de ID_AG_INF>);

Link para o comentário
Compartilhar em outros sites

  • 0

ola "edersonnves"

cara segundo as formar normais, - http://pt.wikipedia.org/wiki/Normaliza%C3%..._banco_de_dados -

você precisa sim criar uma 3ª tabela para fazer o relacionamento entre o BO e o Infrator,

nesta 3ª tabela você precisa apenas do id dos envolvidos (BO e infrator),

colocando o nome do infrator você estaria duplicando informações.

Cara,

posso estar enganado,

mas é alguma coisa parecida com isso:

create table infracao(

id_bo int,

id_infrator int,

primary key(id_bo, id_infrator)

);

alter table infracao

add constraint fk_infracao foreign key (id_infrator) references infrator(id_infrator);

alter table infracao

add constraint fk_infracao1 foreign key (id_bo) references bo(id_bo);

em relação a inserção, pode ser com trigeer, ou via comando msmo...

fica a seu criterio.

espero ter ajudado.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...