PHP에서 데이터의 계층적 관계
우리 앞에 아버지와 아들을 저장하는 과제가 있다고 가정해 봅시다. 각 아버지는 한 명의 아들만 가질 수 있으며, 아들 역시 한 명의 아들만 가질 수 있습니다.
데이터를 어떻게 저장할지 생각해야 합니다.
가장 먼저 떠오를 수 있는 아이디어는
두 개의 테이블을 만드는 것입니다: 아버지를 위한
parents와
아들을 위한 sons. 그런 다음
이 테이블들을 어떤 필드로 연결합니다: son_id
또는 parent_id.
그러나 이 아이디어는 그다지 좋지 않습니다. 왜냐하면 동일한 사람이 동시에 아버지이자 아들일 수 있어서 그를 두 테이블 모두에 저장해야 하기 때문입니다. 이는 불편하고, 더 많은 공간을 차지하며, 쉽게 오류로 이어집니다.
더 나은 방법은 테이블을 자기 자신과
연결하는 것입니다: users 테이블을 만들고,
그 안에 모든 사용자를 저장하며 각 사용자에게
son_id 필드를 만들어
같은 테이블에서 아들의
id를 저장하도록 합니다:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
쿼리
이제 사용자와 그의 아들을 함께 가져오는 쿼리를 작성해 봅시다.
먼저 사용자들부터 가져옵니다:
SELECT
*
FROM
users
이제 사용자에 그들의 아들을 조인합니다. 테이블을 자기 자신과 조인하므로 테이블 이름을 바꿔야 합니다:
LEFT JOIN users as sons
이제 기본 테이블과 이름이 바뀐 테이블 간의 관계를 지정할 수 있습니다:
LEFT JOIN users as sons ON sons.id=users.son_id
이제 필드를 지정합니다:
SELECT
users.name as user_name, sons.name as son_name
모두 모아서 다음 쿼리를 얻습니다:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
실습 문제
우리에게 카테고리가 있다고 가정합니다. 각 카테고리는 상위(부모) 카테고리에 속할 수 있으며, 그 상위 카테고리는 다시 자신의 상위 카테고리에 속하고 이런 식으로 계속될 수 있습니다. 저장 구조를 설명하세요.
카테고리와 그 상위(부모) 카테고리를 함께 가져오는 쿼리를 작성하세요.
카테고리와 그 상위(부모) 카테고리, 그리고 조상(할아버지) 카테고리를 함께 가져오는 쿼리를 작성하세요.
카테고리와 그 상위(부모) 카테고리, 조상(할아버지) 카테고리, 증조상(증조할아버지) 카테고리를 함께 가져오는 쿼리를 작성하세요.