Tôi đang cố triển khai cơ sở dữ liệu dựa trên SQLite có thể lưu trữ cấu trúc đầy đủ của thư mục 100GB với cấu trúc con phức tạp (mong đợi các tệp 50-100K). Mục đích chính của DB sẽ là truy vấn nhanh trên các khía cạnh khác nhau của thư mục này (tổng kích thước, kích thước của thư mục bất kỳ, lịch sử của một thư mục và tất cả nội dung của nó, v.v.).Chọn lược đồ cơ sở dữ liệu để lưu trữ hệ thống thư mục
Tuy nhiên, tôi nhận ra rằng việc tìm kiếm tất cả các tệp trong một thư mục, bao gồm tất cả thư mục con của nó là không thể mà không truy vấn đệ quy nếu tôi chỉ tạo bảng "tệp" chỉ với trường parent_directory. Tôi coi đây là một trong những tính năng quan trọng nhất mà tôi muốn trong mã của mình, vì vậy tôi đã xem xét hai tùy chọn lược đồ cho điều này như trong hình bên dưới.
Trong giản đồ 1, tôi lưu trữ tất cả tên tệp trong một bảng và tên thư mục trong bảng khác. Cả hai đều có một mục "parentdir", nhưng cũng có một văn bản (rõ ràng là văn bản/blob là giống nhau trong sqlite) trường được gọi là "FullPath" sẽ lưu toàn bộ đường dẫn từ gốc vào tệp/thư mục cụ thể (như/etc/abc/def/wow/longpath/test.txt). Tôi không giả định giới hạn thư mục con tối đa để điều này có thể về mặt lý thuyết là trường cho phép tối đa 30 nghìn ký tự. Ý tưởng của tôi là sau đó nếu tôi muốn tất cả các tệp hoặc thư mục thuộc về bất kỳ phụ huynh nào, tôi chỉ truy vấn đường dẫn đầy đủ của phụ huynh trên trường này và nhận được tệpIDS
Trong lược đồ 2, tôi chỉ lưu trữ tên tệp, tệpID và DirNames, DirID trong các thư mục và các tập tin bảng, tương ứng. Nhưng trong một bảng thứ ba được gọi là "Ancestors", tôi lưu trữ cho mỗi tệp một tập hợp các mục cho mỗi thư mục đó là tổ tiên của nó (như trong ví dụ trên, test.txt sẽ có 5 mục, trỏ tới DirIDs của các thư mục, v.v. abc, def, wow và longpath tương ứng). Sau đó, nếu tôi muốn các nội dung đầy đủ của bất kỳ thư mục tôi chỉ cần tìm DirID trong bảng này và nhận được tất cả các fileIDs.
Tôi có thể thấy rằng trong giản đồ 1 giới hạn chính có thể là tìm kiếm toàn văn bản cột văn bản có độ dài thay đổi và trong giản đồ 2 giới hạn chính là tôi có thể phải thêm một tấn mục nhập cho tệp chôn sâu trong 100 thư mục hoặc một cái gì đó.
Giải pháp nào là tốt nhất trong số các giải pháp này? Có giải pháp nào tốt hơn mà tôi không nghĩ đến không?
Bạn có thể quan tâm đến http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html –
Wow đó chính xác là những gì tôi muốn! Vì vậy, giải pháp thứ hai tôi đã cho thấy có phần tương tự như những gì anh ấy mô tả nhưng anh ấy mô tả các trình kích hoạt cực kỳ thanh lịch sẽ giữ cho tất cả dữ liệu hoàn toàn lành mạnh mà không có bất kỳ mã vệ sinh bên ngoài nào! Tôi nghĩ tôi sẽ đi với thiết kế đó! – user930916