Tôi đang tìm cách cấu trúc cơ sở dữ liệu với cơ sở dữ liệu VirtualTreeView và SQLite để truy xuất nhanh dữ liệu. Với VirtualTreeView có một sự kiện OnNodeInit bu nó không phải là luôn luôn thực tế cho mục đích này.Cách cấu trúc cơ sở dữ liệu để truy cập nút nhanh
Dữ liệu được tìm nạp từ các nhóm tin Usenet và cần được tạo luồng. Dữ liệu hữu ích cho luồng là bài id (int64, cũng chính khóa), tài liệu tham khảo (chuỗi tham chiếu đến các bài viết trước trong chủ đề).
Chương trình tìm kiếm các chuỗi trong tham chiếu và xác định trong đó postid cần đi. Vì vậy, ví dụ bài id = 1234, sau đó bài tiếp theo có thể là 1235, và sau đó năm 1236 có thể trả lời cho 1234.
Đây là một cơ sở dữ liệu có thể ví dụ:
post id references parent id
1234 .... .... 0
1235 .... .... 0
1236 .... .... 1234
Vì vậy, bây giờ điều này là làm thế nào nó có vẻ đúng hiện nay.
Bây giờ, sự cố là cách cấu trúc dữ liệu này để truy xuất nhanh hơn. Nếu chỉ có một nút gốc, tôi có thể gán RootNodeCount dựa trên các mục cơ sở dữ liệu và sau đó trong OnNodeInit hãy đọc từng cái một theo yêu cầu. Khi có các nút con thì tôi cần phải sắp xếp lại cơ sở dữ liệu bằng cách nào đó để nó biết làm thế nào để có được các nút con nhanh hơn tùy thuộc vào nút nào được mở.
Tôi đã suy nghĩ gán trường bổ sung "has_subnodes" với ID của nút con sau. Khi một nút được nhấp, nút đó sẽ đọc nút đó và mọi nút được liên kết.
Bạn sẽ tổ chức cơ sở dữ liệu này như thế nào để có thể đọc độc đáo trong OnNodeInit hoặc bạn có sử dụng sự kiện đó không? Các nút cũng có thể được khởi tạo bằng phương thức AddChildNoInit(). Bất kỳ ý tưởng hoặc con trỏ sẽ được chào đón.
CẬP NHẬT (AND cách tôi giải quyết CNTT)
Có một số thông tin không virtualtreeview liên quan có sẵn ở đây: Implementing a hierarchical data structure in a database
Những gì tôi đã kết thúc làm là sử dụng Modified Preorder Tree Traversal để lưu trữ thông tin trong cơ sở dữ liệu về các nút và mỗi lần một nút nhất định được yêu cầu đầu tiên:
a) nó được tra cứu trong bộ nhớ cache nội bộ về cơ bản giữ cấu trúc giống hệt với cấu trúc VirtualTreeView.
b) nếu tìm thấy trong bộ nhớ cache, cache entry này được lấy ra (nó không bao giờ nắm giữ hơn 100 bài)
c) nếu không tìm thấy, thêm 100 mặt hàng được thêm vào trong bộ nhớ cache (50 lên từ nút yêu cầu, và 50 xuống). Số lượng khóa học này có thể được sửa đổi thành 500 hoặc 1000 mục nếu cần. Có một số kiểm tra bổ sung để xem có bao nhiêu lên/xuống nó cần phải đọc để tránh đọc quá nhiều mục trùng lặp.
d) nếu tôi cần tốc độ cao hơn, tôi có thể áp dụng các nút tải kỹ thuật bổ sung từ cơ sở dữ liệu dựa trên số lượng người dùng cuộn virtualtreeview - tương tự như cách std :: vector cấp phát bộ nhớ - trước tiên tôi chỉ tải 100 nút, sau đó người dùng cuộn rất nhiều, tôi tải 200, sau đó 400 vv ... người dùng càng cuộn nhanh hơn nó tải toàn bộ cây nhưng vẫn không tải nó nếu anh/cô ấy không bao giờ cuộn.
Bằng cách này, các nút không bao giờ được nhìn thấy sẽ không bao giờ được tải từ cơ sở dữ liệu. Nó hoạt động tốt khi cuộn bằng bánh xe chuột (thỉnh thoảng có độ trễ ngắn khi nó vượt qua điểm mà bộ nhớ cache trống và cần thêm dữ liệu từ đĩa) và để cuộn bằng các nút/phím mũi tên.Đó là một chút chậm hơn khi bạn kéo thanh cuộn đến vị trí nhất định (nói từ dưới lên giữa) nhưng điều đó được mong đợi vì dữ liệu không thể được lấy từ đĩa ngay lập tức. Nó là tốt nhất nếu tôi xác định trước bao nhiêu bộ nhớ tôi muốn sử dụng cho bộ nhớ cache/mục trước khi tải chúng, càng có nhiều cuộn nhanh hơn nhưng tất nhiên sau đó nó sử dụng nhiều bộ nhớ hơn nếu dữ liệu không bao giờ được hiển thị.
Cha mẹ. Bạn cần tham khảo cha mẹ – OnTheFly
Về cơ bản, dữ liệu giống cây đơn giản nhất có một 'ID' và' ParentID', trong đó ParentID trỏ tới ID mà nó thuộc về một đứa trẻ. Đặt các nút con dưới nút cha thích hợp sẽ (theo dạng đơn giản nhất) yêu cầu lặp qua tất cả các nút hiện có cho đến khi bạn tìm thấy một nút có ID bằng ParentID. Mặc dù lặp qua tất cả các nút VirtualTreeView rất nhanh, nhưng nó có thể trở nên rất chậm khi có nhiều nút được thêm vào. Phương pháp nhanh hơn là thêm tất cả các nút dưới dạng danh sách phẳng và sau đó di chuyển chúng đến vị trí thích hợp, mặc dù thuật toán có thể phức tạp hơn một chút. – LightBulb
@LightBulb Nhưng sau đó tôi mất tính ảo của cây và không thêm chúng một cách năng động? Nếu có rất nhiều nút và subnodes, không cần phải thêm những nút chưa được mở? – Coder12345