Relaciones de datos parentales en PHP
Supongamos que tenemos la tarea de almacenar padres e hijos. Supongamos que cada padre puede tener solo un hijo, y el hijo a su vez también puede tener un hijo.
Necesitamos pensar en 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 relacionar
estas tablas con algún campo: son_id
o parent_id
.
Sin embargo, esta idea no es muy buena, porque 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 mejor opción es relacionar 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 con sus hijos. Vamos a hacer un JOIN de 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
Especifiquemos 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 pertenecer a 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 (categoría superior del padre).
Escriba una consulta que obtenga una categoría junto con su padre, su abuelo y su bisabuelo.