2012-10-27 32 views
17

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.

  1. 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

  2. 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?

Two possible schemas to keep rapid allow rapid retrieval of *all* the descendants of a directory in a complex directory structure

+3

Bạn có thể quan tâm đến http://dirtsimple.org/2010/11/simplest-way-to-do-tree-based-queries.html –

+0

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

Trả lời

17
  1. schema đầu tiên của bạn sẽ chỉ làm việc tốt. Khi bạn đặt chỉ mục trên cột FullPath, hãy sử dụng toán tử BETWEEN phân biệt chữ hoa chữ thường để truy vấn hoặc sử dụng LIKE với số COLLATE NOCASE trên chỉ mục hoặc với PRAGMA case_sensitive_like.

    Xin lưu ý rằng lược đồ này cũng lưu trữ tất cả cha mẹ, nhưng ID (tên) đều được ghép thành một giá trị.

    Đổi tên thư mục sẽ yêu cầu cập nhật tất cả các mục nhập subtree của nó, nhưng bạn đề cập đến lịch sử, vì vậy có thể các mục nhập cũ sẽ vẫn giữ nguyên.

  2. Giản đồ thứ hai của bạn về bản chất là số Closure Table được đề cập trong nhận xét của Dan D. Cẩn thận để không quên các mục nhập cho độ sâu 0.

    Điều này sẽ lưu trữ nhiều dữ liệu, nhưng là ID, giá trị không được quá lớn.

    (Bạn không thực sự cần RelationshipID, phải không?)

  3. Một lựa chọn cây lưu trữ là nested set model, hoặc mô hình khoảng lồng nhau tương tự. Mô hình tập hợp lồng nhau cho phép truy xuất các subtrees bằng cách truy vấn trong một khoảng thời gian, nhưng các bản cập nhật là lông. Mô hình khoảng thời gian lồng nhau sử dụng phân số, không phải là kiểu dữ liệu gốc và do đó không thể được lập chỉ mục.

Tôi ước tính phương án thay thế đầu tiên sẽ dễ sử dụng nhất. Tôi cũng không nên chậm hơn những người khác nếu tra cứu được lập chỉ mục đúng cách.

+0

Cảm ơn bạn đã mô tả chi tiết về 3 ý tưởng! Tôi thực sự nghĩ rằng tôi sẽ đi với Bảng đóng cửa, nó chỉ bằng cách nào đó cảm thấy thanh lịch hơn và cách dữ liệu thực sự có trong cơ sở dữ liệu (và liên kết DirtSimple có những gì trông giống như các trình kích hoạt thực sự thú vị sẽ làm tất cả việc lưu trữ sách trên cơ sở dữ liệu chính nó, mặc dù tôi sẽ dành thời gian suy nghĩ về điều đó rất khó). Trong khi ý tưởng linh sam cũng có vẻ tốt, tôi chỉ là một chút mệt mỏi về việc thao tác chuỗi và cảm thấy các tùy chọn khác có thể mát hơn. Có lẽ tôi sẽ chạy một số thử nghiệm, không gian cũng là một ràng buộc đối với tôi – user930916

+0

Và mối quan hệ phải được thêm vào vì MS Access sẽ không cho phép tôi tạo một bảng mà không có khóa chính và tôi đã tìm thấy nó là công cụ đơn giản nhất để tạo sơ đồ mối quan hệ :) – user930916

+0

Khoá chính 'chính xác' cho bảng đó sẽ là kết hợp của 'DirID' và 'FileID'. –

5

Yêu thích cá nhân của tôi là cách tiếp cận visitation number, mà tôi nghĩ sẽ đặc biệt hữu ích cho bạn vì nó giúp bạn dễ dàng chạy các truy vấn tổng hợp chống lại một bản ghi và hậu duệ của nó.

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