2011-11-15 12 views
7

Trong khi tạo lại CMS, tôi muốn thay thế cho cách tiếp cận cha/mẹ truyền thống để quản lý hệ thống phân cấp sơ đồ trang/sơ đồ trang. Tôi đã nhớ đã nhìn thấy mô hình tập hợp lồng nhau một lúc, nhưng không thể nhớ nó được gọi là gì. Vì vậy, tôi tình cờ gặp một cách tiếp cận tương tự mà tôi muốn đánh giá và so sánh các thuộc tính, đảm bảo rằng tôi sẽ không chạy vào những hạn chế câm sau này bởi vì tôi đã không đi với những gì đã được kiểm tra thời gian. Vì vậy, xin vui lòng tư vấn nếu A) nó đã được phát minh (những gì nó được gọi là ?!), B) có những sai sót cơ bản trong tài sản, hoặc C) đó là một cách tiếp cận tốt (xin vui lòng cho tốt biện minh!).Bộ phận lồng ghép của tôi cho các tập lồng nhau cho các tập dữ liệu phân cấp theo chiều sâu tùy ý: Tốt hay Xấu?

Xem xét danh sách này:

  • Home
    • Giới thiệu
    • Liên hệ
    • Sản phẩm
      • Quần áo
      • Sách
      • Điện tử
    • Kiến thức cơ sở
    • thứ khác

Theo mô hình bộ lồng nhau, tôi tin rằng bạn lưu trữ bên trái/mô tả phù hợp với mỗi nút với một traversal sâu-đầu tiên:

Home     1-18 
    About Us   2-3 
    Contact Us  4-5 
    Products   6-13 
     Clothing  7-8 
     Books   9-10 
     Electronics 11-12 
    Knowledge Base 14-15 
    Other stuff  16-17 

Và đây là "cách sai lầm" của tôi mà tôi bắt đầu thích hơn:

Home     1-9 
    About Us   2-2 
    Contact Us  3-3 
    Products   4-7 
     Clothing  5-5 
     Books   6-6 
     Electronics 7-7 
    Knowledge Base 8-8 
    Other stuff  9-9 

Thay vì cặp trái/phải, tôi đang lưu trữ ID và LAST_CONTAINED_ID. Tôi thấy rằng rất nhiều các thuộc tính đều giống nhau (hoặc rất tương tự):

  • Nút gốc là ID = 1
  • Đối với "lá", cả hai thuộc tính đều bình đẳng, trong khi với các ngành, họ không
  • tổng số "subnodes" cho bất kỳ nút nhất định là LAST_CONTAINED_ID - ID
  • Tất cả chứa các nút có một ID> ID của container, nhưng < = của container LAST_CONTAINED_ID
  • các nút tổ tiên có một ID < trẻ ID , mà còn LAST_CONTAINED_ID> = ID con
  • Độ sâu là SUM của tổ tiên các nút

Bên cạnh đó, ID phục vụ, định danh duy nhất để cụ thể (không có khoảng trống!). Tôi đã tìm thấy nó dễ dàng hơn để lưu trữ các tham chiếu DEPTH và PARENT cho sự đơn giản, nhưng đó cũng là điều tương tự đối với các bộ lồng nhau từ những gì tôi hiểu.

Vì vậy, điều này có được tính là tập hợp lồng nhau không? Và nó đã là một cách tiếp cận phổ biến (nhưng tại sao tôi chưa nghe về nó trước đây ...)? Có một lý do chính đáng tại sao tôi nên sử dụng một tập hợp lồng nhau thực sự về điều này?

Tôi hoan nghênh suy nghĩ của bạn.

+0

FYI, mô hình tập lồng nhau là một cách có một bảng duy nhất trong một RDBMS lưu trữ tất cả các thông tin cần thiết cho một hệ thống phân cấp của một chiều sâu không xác định (ví dụ: một danh sách vô hạn mà không đệ quy): http://en.wikipedia.org/wiki/Nested_set_model#Example – landons

Trả lời

4

Lợi thế duy nhất nó mang lại là tính năng 'không có khoảng trống', nhưng để đạt được điều đó bạn phải thay đổi logic được áp dụng cho giá trị đúng. Trong mô hình ban đầu, bạn nhận được con của 'Sản phẩm' bằng cách xem tất cả các giá trị đó 6 < .. < 13, nhưng trong mô hình của bạn, bạn có được những trẻ đó bằng cách xem các giá trị 4 < .. < = 7. Phải điều trị đúng các giá trị khác với giá trị bên trái làm cho nó kém thanh lịch hơn một chút.
Một điểm yếu khác là trong bản gốc, bước nhảy từ 12 đến 14 làm nổi bật rằng bạn đã thay đổi cấp độ, trong khi trong mô hình của bạn, bạn không nhận được tín hiệu trực quan như vậy.
Vì vậy, nếu bạn hài lòng khi sử dụng (<, < =) thay cho (<, <) thì nó hoạt động. (Vì nó có vẻ tương đương, tôi không thể nói 'tốt' hay 'xấu', nhưng bạn đã nêu bật những nguy hiểm của việc triển khai đường đi ít đi.)

+2

Tôi nghĩ bạn đúng về bước nhảy từ 12-14. Tôi tin rằng đó là sự thật (trong các bộ lồng nhau thông thường), cho bất kỳ nút nào 'n1', nếu có một nút,' n2', với 'n1.right + 1' ==' n2.left' thì 'n2' là người anh em tiếp theo (và tương tự cho việc rời đi), bị mất trong mô hình mới này. –

+0

Đây chính xác là những gì tôi đang tìm kiếm! (Mặc dù, tôi đã hy vọng nhận được nhiều phản hồi hơn, nhưng điều này là hữu ích.) – landons

+1

Tôi đã tìm thấy một vài thuộc tính khác mà tôi thích, việc điều chỉnh các giá trị trên chèn/xóa ở một chỉ mục cụ thể rất đơn giản. Việc xóa một nhánh sẽ thực sự di chuyển tất cả các con lên một mức mặc định (đây là một lựa chọn tốt cho việc xóa tầng cho một thiết lập khóa cha-mẹ truyền thống). Tôi nghĩ rằng có thể sống mà không có sự đơn giản nextSibling(). – landons