Tôi có một tập tin gọi là các công ty
Bảng MySQL trông như thế này:
+----------+----------+----------+
| id_comp | tên_comp | id_parent |
+----------+----------+----------+
| 1 | comp1 | NULL |
| 2 | máy tính2 | 1 |
| 3 | máy tính3 | 2 |
| 4 | máy tính4 | 2 |
| 5 | comp5 | 2 |
| 6 | máy tính6 | 1 |
| 3 | máy tính3 | 6 |
| 5 | comp5 | 6 |
| 7 | máy tính7 | 6 |
| 4 | máy tính4 | 6 |
| 8 | máy tính8 | 4 |
+----------+----------+----------+
Mỗi công ty có thể có nhiều công ty mẹ (ví dụ:comp3
, đó là comp2
Và comp6
của các công ty con), mỗi công ty mẹ có thể có nhiều công ty con, mỗi công ty con có thể là cha mẹ của nhiều công ty con, v.v...do đó nó có thể có vô số cấp độ (mối quan hệ).
Tôi đã xem xét một số giải pháp ( http://www.codeproject.com/Articles/818694/SQL-queries-to-manage-hierarchical-or-parent-child 、 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ ), nhưng tôi không nghĩ nó phù hợp với câu hỏi của mình vì cùng một công ty (dựa trên id_thành phần
cột) có thể có nhiều công ty mẹ.
Tôi có hai câu hỏi về điều này:
- Đây có phải là cách tiếp cận phù hợp nếu tôi có hàng nghìn mối quan hệ (có thể mở rộng)?
- đưa ra một
tên
(Đây là cái duy nhất dựa trênid_thành phần
), làm cách nào để chọn anh chị em của nó (cùng parent_id), cha mẹ trực tiếp và con trực tiếp của nó.
Bạn có mối quan hệ "nhiều: nhiều" đơn giản. Tuy nhiên, bạn có một hạn chế không thực sự phù hợp (và không thể kiểm tra được) vì không có vòng lặp.
TẠO BẢNG Quan hệ (
id_thành phần ...,
id_cha mẹ ...,
KHÓA CHÍNH (id_comp, id_parent), -- để đạt tới "lên"
INDEX(id_parent, id_comp) -- để đạt tới "xuống"
) ĐỘNG CƠ=InnoDB;
Điều này sẽ mở rộng tới hàng triệu hoặc thậm chí hàng tỷ mối quan hệ. Vì theo định nghĩa,KHÓA CHÍNH
Đúng ĐỘC NHẤT
Và MỤC LỤC
, vì vậy nó ngăn chặn các mối quan hệ trùng lặp (1
Đúng2
cha mẹ chỉ một lần) và cung cấp một cách hiệu quả để di chuyển theo một hướng.
Sử dụng khi cần thiếtRIÊNG BIỆT
thay vìNHÓM THEO
. không sử dụng TRONG (CHỌN ...)
, nó có xu hướng rất chậm.
Anh chị em của tôi:
CHỌN DISTINCT their_kids.*
TỪ Mối quan hệ NHƯ tôi
THAM GIA Quan hệ AS my_parents TRÊN my_parents.id_comp = me.id_parent
THAM GIA Quan hệ AS their_kids TRÊN their_kids.id_parent = parents.id_comp
NƠI me.id_comp = @me
VÀ their_kids.id_comp != @me;
Cha mẹ (trực tiếp) của tôi:
CHỌN my_parents.*
TỪ Mối quan hệ NHƯ tôi
THAM GIA Quan hệ AS my_parents TRÊN my_parents.id_comp = me.id_parent
NƠI me.id_comp = @me;
Con (trực tiếp) của tôi:
CHỌN my_kids.*
TỪ Mối quan hệ NHƯ tôi
THAM GIA Quan hệ AS my_kids TRÊN my_kids.id_parent = me.id_comp
NƠI me.id_comp = @me;
Các cô, chú, anh chị em họ sẽ có chút bối rối. Tất cả tổ tiên hoặc con cháu sẽ bối rối hơn và phải được thực hiện thông qua các vòng lặp trong mã ứng dụng hoặc các thủ tục được lưu trữ.
Tôi là một lập trình viên xuất sắc, rất giỏi!