Tổng quan tốt
Nói chung, bạn đang đưa ra quyết định giữa thời gian đọc nhanh (ví dụ: tập hợp lồng nhau) hoặc thời gian viết nhanh (danh sách kề). Thông thường, bạn kết thúc với sự kết hợp của các tùy chọn bên dưới phù hợp nhất với nhu cầu của bạn. Sau đây cung cấp một số đọc sâu:
- Thêm một khoảng thời gian lồng nhau so với danh sách điều chỉnh : so sánh tốt nhất của danh sách điều chỉnh, đường dẫn cụ thể, tập hợp lồng nhau và khoảng thời gian lồng nhau mà tôi đã tìm thấy.
- Các mô hình cho dữ liệu phân cấp : các slide với các giải thích tốt về sự đánh đổi và sử dụng ví dụ
- Đại diện cho hệ thống phân cấp trong MySQL : đặc biệt rất tốt về Nested Set nói riêng
- Dữ liệu phân cấp trong RDBMS : tập hợp các liên kết được tổ chức tốt và toàn diện nhất mà tôi đã thấy, nhưng không có nhiều cách giải thích
Tùy chọn
Những người tôi biết và các đặc điểm chung:
- Danh sách điều chỉnh :
- Cột: ID, ParentID
- Dễ để thực hiện.
- Nút di chuyển giá rẻ, chèn và xóa.
- Đắt tiền để tìm cấp độ, tổ tiên & con cháu, con đường
- Tránh N + 1 thông qua Biểu thức bảng chung trong cơ sở dữ liệu hỗ trợ chúng
- Nested Set (còn gọi là Traversal Preorder Tree Traversal )
- Cột: Trái, Phải
- Tổ tiên giá rẻ, con cháu
- Di
O(n/2)
chuyển rất tốn kém , chèn, xóa do mã hóa dễ bay hơi
- Bảng cầu (còn gọi là Bảng đóng / kích hoạt w )
- Sử dụng bảng tham gia riêng biệt với: tổ tiên, hậu duệ, độ sâu (tùy chọn)
- Tổ tiên và con cháu giá rẻ
- Ghi chi phí
O(log n)
(kích thước của cây con) để chèn, cập nhật, xóa - Mã hóa chuẩn hóa: tốt cho thống kê RDBMS và công cụ lập kế hoạch truy vấn khi tham gia
- Yêu cầu nhiều hàng trên mỗi nút
- Cột Lineage (còn gọi là Đường dẫn cụ thể hóa , liệt kê đường dẫn)
- Cột: dòng dõi (ví dụ / cha mẹ / con / cháu / v.v ...)
- Hậu duệ giá rẻ thông qua truy vấn tiền tố (ví dụ
LEFT(lineage, #) = '/enumerated/path'
) - Ghi chi phí
O(log n)
(kích thước của cây con) để chèn, cập nhật, xóa - Không liên quan: dựa trên kiểu dữ liệu mảng hoặc định dạng chuỗi nối tiếp
- Khoảng cách lồng nhau
- Giống như tập hợp lồng nhau, nhưng với thực / float / thập phân để mã hóa không biến động (di chuyển / chèn / xóa không tốn kém)
- Có vấn đề thực / nổi / thập phân / chính xác
- Biến thể mã hóa ma trận thêm mã hóa tổ tiên (đường dẫn cụ thể hóa) cho "miễn phí", nhưng có thêm độ khó của đại số tuyến tính.
- Bàn phẳng
- Danh sách điều chỉnh đã được sửa đổi có thêm cột Cấp và Xếp hạng (ví dụ: đặt hàng) cho mỗi bản ghi.
- Giá rẻ để lặp / phân trang
- Di chuyển và xóa tốn kém
- Sử dụng tốt: thảo luận theo luồng - diễn đàn / bình luận blog
- Nhiều cột dòng
- Cột: một cho mỗi cấp độ dòng dõi, đề cập đến tất cả các bậc cha mẹ cho đến gốc, các cấp độ từ cấp độ của vật phẩm được đặt thành NULL
- Tổ tiên giá rẻ, con cháu, đẳng cấp
- Giá rẻ chèn, xóa, di chuyển của lá
- Đắt tiền, xóa, di chuyển các nút bên trong
- Giới hạn cứng cho việc phân cấp có thể sâu đến mức nào
Cơ sở dữ liệu ghi chú
MySQL
Oracle
- Sử dụng CONNECT BY để duyệt qua Danh sách điều chỉnh
PostgreSQL
- kiểu dữ liệu ltree cho đường dẫn vật chất
Máy chủ SQL
- Tóm tắt chung
- 2008 cung cấp kiểu dữ liệu HVELyId xuất hiện để trợ giúp với cách tiếp cận Cột Lineage và mở rộng độ sâu có thể được biểu diễn.
Closure Tables
vượt trội hơnAdjacency List
,Path Enumeration
vàNested Sets
về mặt dễ sử dụng (và tôi cũng đoán hiệu suất).