Mối quan hệ dữ liệu cha-con trong Python
Giả sử chúng ta có nhiệm vụ lưu trữ thông tin về các ông bố và con trai. Giả định mỗi bố chỉ có thể có một con trai duy nhất, và người con trai đó cũng có thể có một con trai duy nhất.
Chúng ta cần nghĩ cách lưu trữ
dữ liệu. Ý tưởng đầu tiên có thể nảy ra là
tạo hai bảng: parents
cho các ông bố và sons cho các con trai. Sau đó
liên kết các bảng này bằng một trường nào đó:
son_id hoặc parent_id.
Tuy nhiên, đây không phải là ý tưởng hay - bởi vì một người có thể đồng thời vừa là bố vừa là con trai - và sẽ phải lưu trữ thông tin của người đó trong cả hai bảng, điều này bất tiện, chiếm nhiều dung lượng hơn và dễ dẫn đến lỗi.
Phương án tốt hơn là liên kết bảng
với chính nó: hãy tạo bảng users,
trong đó lưu trữ tất cả người dùng và mỗi người
sẽ có một trường son_id, trong đó sẽ
lưu trữ id của con trai từ chính bảng đó:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Truy vấn
Bây giờ hãy viết một truy vấn để lấy thông tin người dùng cùng với con trai của họ.
Đầu tiên, hãy đơn giản lấy danh sách người dùng:
SELECT
*
FROM
users
Bây giờ hãy thực hiện LEFT JOIN để kết nối với con trai của họ. Chúng ta sẽ JOIN bảng với chính nó, vì vậy cần đổi tên bảng:
LEFT JOIN users as sons
Bây giờ chúng ta có thể chỉ định mối quan hệ giữa bảng chính và bảng đã đổi tên:
LEFT JOIN users as sons ON sons.id=users.son_id
Bây giờ hãy chỉ định các trường cần lấy:
SELECT
users.name as user_name, sons.name as son_name
Tổng hợp tất cả lại, chúng ta có truy vấn hoàn chỉnh sau:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Bài tập thực hành
Giả sử chúng ta có các danh mục. Mỗi danh mục có thể thuộc về một danh mục cha, danh mục cha đó lại có thể có danh mục cha của nó và tiếp tục như vậy. Hãy mô tả cấu trúc lưu trữ.
Viết một truy vấn để lấy một danh mục cùng với danh mục cha của nó.
Viết một truy vấn để lấy một danh mục cùng với danh mục cha và danh mục ông (cha của cha) của nó.
Viết một truy vấn để lấy một danh mục cùng với danh mục cha, danh mục ông và danh mục cụ (cha của ông) của nó.