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:
| 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:
SELECT
*
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:
LEFT JOIN users as sons
Agora podemos especificar a relação entre a tabela principal e a tabela renomeada:
LEFT JOIN users as sons ON sons.id=users.son_id
Agora vamos especificar os campos:
SELECT
users.name as user_name, sons.name as son_name
Vamos juntar tudo e obter a seguinte consulta:
SELECT
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
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.
Escreva uma consulta que obtenha a categoria junto com sua categoria pai.
Escreva uma consulta que obtenha a categoria junto com seu pai e seu avô (pai do pai).
Escreva uma consulta que obtenha a categoria junto com seu pai, seu avô e seu bisavô.