Database-Design

如何在我的數據庫中設計和實現文件夾和子文件夾(無限)?

  • September 24, 2021

所以我正在使用 Qt、C++ 和 SQLite 建構一個桌面應用程序。

我希望使用者能夠創建任意數量的文件夾,並且這些文件夾可以有“筆記”(它是一個筆記應用程序)和/或任意數量的子文件夾。

我的問題是如何在數據庫設計中實現這樣的東西?

例如,數據庫中的每個文件夾記錄都可以有一個“parent_folder”欄位,那些沒有父文件夾的文件夾有一個特定的 id,而其他文件夾記錄的 rowid 是它們的父文件夾。

我將不得不以某種方式遍歷此表,動態添加到我的 gui(我的樹小元件)文件夾和子文件夾中。更不用說如果我還有一個筆記表,每個筆記都必須有一個與其父文件夾的rowid相對應的id。

這是一個半生不熟的解決方案,我還沒有真正開發好,但這是我能想到的第一件事。(這是我的第一個問題,請見諒)

這是一個經典的“樹形結構”設計。

…數據庫中的每個文件夾記錄都可以有一個“parent_folder”欄位…

一位父母,許多孩子。這是正確的。

…那些沒有父文件夾的人有一個特定的ID …

這個id(零是一個明顯的選擇)將代表“萬物的根”,它永遠不能被刪除,並且只能在其中創建新條目(即不能有兩個根節點)。

這樣的設計應該可以正常工作。

我將不得不以某種方式遍歷此表,動態添加到我的 gui(我的樹小元件)文件夾和子文件夾中。

現在; 等一下。 呢?

好的,您可以一次性填充整棵樹。你受苦

$$ big $$,一次性點擊載入所有內容,然後點擊周圍會非常快。聽起來不錯。

除此之外,隨著時間的推移,您的樹可能會累積成千上萬的條目,這將需要長時間來迭代並載入到 Tree 控制項中。 關於使用者的兩件事:

  • 一般來說,他們並不以耐心著稱。
  • 他們傾向於習慣性地重複使用相同的東西(而不是四處遊蕩,“隨機”使用大量應用程序)。他們傾向於找到應用程序中對他們“有用”的部分,然後堅持使用它們。在這種情況下,這意味著他們只會對“他們的”樹節點感興趣。

因此,或者,您可以填充級別樹節點並將其保留在.

當使用者要求查看特定樹節點內的內容時,您只需獲取滿足請求的行。好的,這意味著對數據庫的更多查詢,是的,使用者必須等待每個查詢,但是每個查詢都會

$$ much $$更快,使用者只會等待他們真正感興趣的東西(而不是系統中**存在的 9,999,986 個其他東西,但該使用者並不真正關心)。

只要您的 parent_id 列被正確索引,它就可以很好地工作。

引用自:https://dba.stackexchange.com/questions/300079