MySQL - Uma única entidade (N:N)

Bom dia pessoal. Sou novo em banco de dados e estou tentando entender alguns conceitos:

Uma única entidade (N:N)

Uma empresa trabalha com projetos de forma horizontal, onde a pessoa N em um projeto pode ser a gestora da pessoa X e em outro projeto a pessoa X pode ser a gestora da pessoa N. Isso podendo ser para diversos projetos e pessoas.

1) Criei um cadastro de pessoas da seguinte forma:

CREATE TABLE tb_natural_person(
id_natural_person INT NOT NULL AUTO_INCREMENT,
first_name_natural_person VARCHAR(255) NOT NULL,
last_name_natural_person VARCHAR(255) NOT NULL,
PRIMARY KEY(id_natural_person)
)

2) Para que pudesse uma ter um relacionamento hierárquico de um funcionário para o outro (N:N), criei uma nova tabela onde tanto a coluna “parent_id_natural_person_relation” quanto a coluna “child_id_natural_person_relation” se referenciam (FOREIGN KEY) a coluna “id_natural_person” da primeira tabela.

CREATE TABLE tb_natural_person_relation(
id_natural_person_relation INT NOT NULL AUTO_INCREMENT,
parent_id_natural_person_relation INT NOT NULL,
child_id_natural_person_relation INT NOT NULL,
PRIMARY KEY(id_natural_person_relation),
FOREIGN KEY (parent_id_natural_person_relation)
REFERENCES tb_natural_person(id_natural_person),
FOREIGN KEY (child_id_natural_person_relation)
REFERENCES tb_natural_person(id_natural_person)
)

3) Ao tentar fazer um SELECT via JOIN (INNER JOIN, LEFT JOIN, UNION, etc) percebi que não consigo selecionar os campos “first_name_natural_person” e “last_name_natural_person” relacionados aos campos “parent_id_natural_person_relation” e “child_id_natural_person_relation” (ou pelo menos não sei como).

Pergunta: Tenho que fazer a contrução e relacionamento destas tabelas, onde possa ter quantas “relações hierárquicas” forem necessárias. Está certo a forma que eu estou estruturando acima? Caso sim, como poderia escrever o SELECT de uma forma que apareça em uma linha os campos “first_name_natural_person” e “last_name_natural_person” relacionados aos campos “parent_id_natural_person_relation” e “child_id_natural_person_relation” da outra tabela? Caso esteja errado minha forma de raciocínio, como seria a forma correta?

Muito obrigado e abraços,

Guilherme

Podes fazer sim com um join:

SELECT p.first_name_natural_person firstname_parent, c.first_name_natural_person firstname_child
  FROM tb_natural_person_relation r 
 INNER JOIN tb_natural_person p ON r.parent_id_natural_person_relation = p.id_natural_person 
 INNER JOIN tb_natural_person c ON r.child_id_natural_person_relation = c.id_natural_person 

mas… é mesmo isso que pretendes?

Se “a pessoa N em um projeto pode ser a gestora da pessoa X e em outro projeto a pessoa X pode ser a gestora da pessoa N” onde está na tua tabela de relações, o projecto? Essa relação só ira existir no contexto de um projeto. E será que queres mesmo ter uma tabela de relações entre pessoas ou antes entre projetos e pessoas, com um role associado (Gestor/Membro)

1 curtida

Boa tarde! Sim, você está certo. :slight_smile: É necessária ainda a criação de uma tabela relacionando os projetos e as pessoas.

Muito obrigado pela a ajuda.

Guilherme