2010-10-09 30 views
8

Tôi đang cố gắng để tạo ra một danh sách thứ bậc với PHP và một bảng cài đặt SQLite như thế này:Tạo một cây danh sách với SQLite

| itemid | parentid | name | 
    ----------------------------------------- 
    | 1  | null  | Item1 | 
    | 2  | null  | Item2 | 
    | 3  | 1   | Item3 | 
    | 4  | 1   | Item4 | 
    | 5  | 2   | Item5 | 
    | 6  | 5   | Item6 | 

Các danh sách sẽ được xây dựng với danh sách không có thứ tự và cho phép cho loại cây cấu trúc:

Item1 
    |_Item3 
    |_Item4 
Item2 
    |_Item5 
     |_Item6 

Tôi đã thấy điều này được thực hiện với các thư mục và mảng phẳng, nhưng tôi dường như không làm cho nó hoạt động đúng với cấu trúc này và không có giới hạn độ sâu.

+0

điều gì đang xảy ra? – Anon

Trả lời

13

Bạn đang sử dụng thiết kế sách giáo khoa để lưu trữ dữ liệu phân cấp trong cơ sở dữ liệu SQL. Thiết kế này được gọi là Danh sách adjacency, tức là mỗi nút trong cấu trúc phân cấp có khóa ngoài là parentid cho cha mẹ trực tiếp của nó.

Với thiết kế này, bạn không thể tạo cây giống như bạn mô tả và hỗ trợ độ sâu tùy ý cho cây. Bạn đã tìm ra điều này.

Hầu hết các cơ sở dữ liệu SQL khác (PostgreSQL, Microsoft, Oracle, IBM DB2) hỗ trợ truy vấn đệ quy, giải quyết vấn đề này. Nhưng SQLite và MySQL chưa hỗ trợ tính năng này của SQL.

Vì vậy, bạn cần một giải pháp khác để lưu trữ cấu trúc phân cấp. Có một số giải pháp cho việc này. Xem bản trình bày của tôi Models for Hierarchical Data with PHP and MySQL để biết mô tả và ví dụ.

Tôi thường thích Bảng đóng cửa gọi là thiết kế, nhưng mỗi thiết kế đều có điểm mạnh và điểm yếu. Cái nào là tốt nhất cho dự án của bạn phụ thuộc vào loại truy vấn nào bạn cần thực hiện hiệu quả với dữ liệu của mình. Vì vậy, bạn nên đi nghiên cứu các giải pháp và chọn một cho chính mình.

+0

Cảm ơn bạn đã cung cấp thông tin. Chính xác những gì tôi cần. – syllabic

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