Relaciones de datos recursivas en Python
Supongamos que tenemos la tarea de almacenar padres e hijos. Supongamos que cada padre puede tener solo un hijo, y un hijo a su vez también puede tener un hijo.
Necesitamos pensar cómo almacenaremos los
datos. La primera idea que puede venir
a la mente es crear dos tablas: parents
para padres y sons para hijos. Luego
enlazar estas tablas con algún campo:
son_id o parent_id.
Sin embargo, esta idea no es muy buena, ya que la misma persona puede ser simultáneamente padre e hijo - y tendríamos que almacenarlo en ambas tablas, lo cual es inconveniente, ocupa más espacio y fácilmente conduce a errores.
Una opción mejor es enlazar la tabla
consigo misma: creemos una tabla users,
en ella almacenaremos todos los usuarios y a cada uno
le crearemos un campo son_id, en el cual se
almacenará el id del hijo de esta misma tabla:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Consultas
Ahora escribamos una consulta que obtenga al usuario junto con su hijo.
Para empezar, simplemente obtengamos los usuarios:
SELECT
*
FROM
users
Ahora hagamos un JOIN de los usuarios con sus hijos. Uniremos la tabla consigo misma, por lo que necesitamos realizar un renombrado de la misma:
LEFT JOIN users as sons
Ahora podemos especificar la relación entre la tabla principal y la renombrada:
LEFT JOIN users as sons ON sons.id=users.son_id
Especificamos ahora los campos:
SELECT
users.name as user_name, sons.name as son_name
Juntemos todo y obtendremos la siguiente 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
Tareas prácticas
Supongamos que tenemos categorías. Cada categoría puede pertenecer a una categoría padre, que a su vez puede tener su propia categoría padre y así sucesivamente. Describa la estructura de almacenamiento.
Escriba una consulta que obtenga una categoría junto con su categoría padre.
Escriba una consulta que obtenga una categoría junto con su padre y su abuelo.
Escriba una consulta que obtenga una categoría junto con su padre, su abuelo y su bisabuelo.