Relacionamentos de Dados em Python

Suponha que tenhamos a tarefa de armazenar pais e filhos. Suponha que cada pai possa ter apenas um filho, e o filho, por sua vez, também pode ter um filho.

Precisamos pensar em como armazenaremos os dados. A primeira ideia que pode vir à mente é criar duas tabelas: parents para pais e sons para filhos. Em seguida, relacionar essas tabelas por meio de algum campo: son_id ou parent_id.

No entanto, essa ideia não é muito boa - pois a mesma pessoa pode ser simultaneamente pai e filho - e teríamos que armazená-la em ambas as tabelas, o que é inconveniente, ocupa mais espaço e pode facilmente levar a erros.

Uma opção melhor é relacionar a tabela consigo mesma: vamos criar uma tabela users, nela armazenaremos todos os usuários e para cada um criaremos um campo son_id, onde será armazenado o id do filho nesta mesma tabela:

users
id name son_id
1 user1 2
2 user2 3
3 user3 null

Consultas

Agora vamos escrever uma consulta que obtenha o usuário junto com seu filho.

Para começar, vamos apenas obter os usuários:

sqlSELECT
  *
FROM
  users

Agora vamos fazer um JOIN dos usuários com seus filhos. Faremos um JOIN da tabela com ela mesma, portanto precisamos renomeá-la:

sqlLEFT JOIN users as sons

Agora podemos especificar a relação entre a tabela principal e a tabela renomeada:

sqlLEFT JOIN users as sons ON sons.id=users.son_id

Agora vamos especificar os campos:

sqlSELECT
  users.name as user_name, sons.name as son_name

Vamos juntar tudo e obter a seguinte consulta:

sqlSELECT
  users.name as user_name, sons.name as son_name
FROM
  users
LEFT JOIN users as sons ON sons.id=users.son_id

Tarefas Práticas

Задание 1

Suponha que temos categorias. Cada categoria pode pertencer a uma categoria pai, que por sua vez pertence à sua própria categoria pai e assim sucessivamente. Descreva a estrutura de armazenamento.

Задание 2

Escreva uma consulta que obtenha a categoria junto com sua categoria pai.

Задание 3

Escreva uma consulta que obtenha a categoria junto com seu pai e seu avô (pai do pai).

Задание 4

Escreva uma consulta que obtenha a categoria junto com seu pai, seu avô e seu bisavô.