Python에서 데이터의 계층적 관계
부모와 자식을 저장해야 하는 작업이 있다고 가정해 봅시다. 각 부모는 오직 한 명의 자식만을 가질 수 있으며, 자식 역시 자신의 자식을 하나만 가질 수 있다고 해보겠습니다.
데이터를 어떻게 저장할지 고민해야 합니다.
처음 떠오를 수 있는 아이디어는 두 개의 테이블을 만드는 것입니다:
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
실습 문제
카테고리가 있다고 가정해 봅시다. 각 카테고리는 상위 카테고리에 속할 수 있고, 그 상위 카테고리는 다시 자신의 상위 카테고리에 속하는 식으로 계속될 수 있습니다. 저장 구조를 설명하세요.
카테고리와 그 상위 카테고리를 함께 가져오는 쿼리를 작성하세요.
카테고리와 그 상위 카테고리, 그리고 상위의 상위 카테고리를 함께 가져오는 쿼리를 작성하세요.
카테고리와 그 상위 카테고리, 상위의 상위 카테고리, 그리고 상위의 상위의 상위 카테고리를 함께 가져오는 쿼리를 작성하세요.