2010-04-07 36 views
10

Tôi có một bảng MySQL đại diện cho dữ liệu cho một thành phần cây GUI, đây là cấu trúc của bảng của tôi:Làm thế nào để chọn tất cả các bậc cha mẹ của một nút trong một bảng mysql phân cấp?

treeTable ( 
    id INT NOT NULL PRIMARY KEY, 
    parentId INT, 
    name VARCHAR(255) 
); 

parentId là khóa ngoại tự tham khảo.

Bây giờ tôi muốn viết một thủ tục lưu sẵn nhận id nút và trả về tập kết quả có chứa nút đó và tất cả cha mẹ của nó.

Ví dụ, giả sử rằng bàn của tôi đã chứa đầy dữ liệu này:

1, null, 'root' 
2, 1 , 'level_1' 
3, 2 , 'level_2' 

Bây giờ tôi muốn để có được tất cả các nút cha của nút 3 (nút 1 và 2) và trả về một tập kết quả có chứa tất cả cây Hồ sơ. Ai đó giúp tôi được không, làm ơn?

+0

Nhìn vào chủ đề này: [thứ bậc-data-in-mysql] [1] [1]: http://stackoverflow.com/questions/1085287/hierarchical-data-in- mysql –

Trả lời

2

Câu hỏi hay. Trong Oracle, bạn sẽ sử dụng một cái gì đó như CONNECT BY.

Vì bạn đang sử dụng MySQL, tôi khuyên bạn nên thay đổi cấu trúc dữ liệu của mình để trả lời một cách hiệu quả truy vấn đó. Here là một số ý tưởng.

1

There was a similar discussion điều này có thể hữu ích trong việc giải quyết vấn đề này.

Tôi nghĩ rằng tôi có thể tấn công vấn đề này bằng cách đệ quy truy xuất dữ liệu cho đến khi tôi đến nút gốc (cấp độ gốc là null). Tôi có thể có khuynh hướng thực hiện điều này bên ngoài thủ tục lưu trữ ban đầu (liên tục gọi điều cho đến khi hàng được truy xuất có cha mẹ rỗng), nhưng giải pháp "bảng đóng" trên trang tôi tham chiếu ở đây trông giống như một giải pháp tuyệt vời.

1

Nhìn here trong "Truy xuất một đường dẫn đơn". Nhưng tốt hơn nên sử dụng phương pháp lồng nhau, sẽ dễ dàng hơn khi làm việc với cây. Ngoài ra, tôi khuyên bạn nên đọc bài thuyết trình "Trees In The Database - Advanced data structures".

1

Ngoài ra còn có materialized paths để suy nghĩ. Khái niệm khá đơn giản đó thực sự là cơ sở dữ liệu bất khả tri. Dễ dàng hơn nhiều để quản lý chèn vv như trái ngược với bộ lồng nhau, bạn không cần phải biết bạn đang còn lại/nút phải vv trước khi bạn chèn.

1

MySQL không hỗ trợ chức năng bảng có giá trị 18.2.1. Stored Routine Syntax (đó là những gì bạn cần để có thể trả lại một tập kết quả tùy ý).

Nếu không có họ bạn có ba lựa chọn:

  1. unroll truy vấn cây đến độ sâu tối đa cố định và hạn chế sự làm tổ cho phép trong hệ thống cấp bậc của bạn,
  2. sử dụng một vòng lặp để ghi dữ liệu vào một bảng tạm thời và giới thiệu một số quy ước để trả lại kết quả cho người gọi. Bạn sẽ cần phải xem xét lại entrancy, hoặc,
  3. tính trước các kết quả bằng cách bao gồm tất cả tổ tiên của mỗi thành phần vào một bảng hỗ trợ (như được hiển thị) và duy trì nó với các trigger trên treeTable. Bằng cách này, thủ tục được lưu trữ trả về các hàng trong parentTable được lọc một cách thích hợp. Bạn sẽ cần phải tạo ra một khóa chính hợp chất và có thể chỉ số để truy cập hiệu quả.

Tùy chọn thứ ba có hàng rất nhỏ, sẽ mang lại hiệu suất tốt và tránh giới hạn nhân tạo.

parentTable (
    id INT NOT NULL, 
    parentId INT NOT NULL 
); 

Đề xuất sử dụng phương pháp lồng nhau có thể phù hợp trong ứng dụng này nơi dữ liệu phần lớn là tĩnh. Một bộ dữ liệu thay đổi nhanh chóng sẽ bắt đầu tác động đến hiệu suất I/O vì trung bình một nửa số hàng trong bảng được cập nhật cho mỗi lần chèn hoặc xóa.

Các vấn đề liên quan