平面文件數據庫有它們自己的位置,並且對於正確的域很適用。
過去的郵件服務器和NNTP服務器真的推動了你能夠真正承擔這些事情的程度(實際上相當遠 - 文件系統可以有數百萬個文件和目錄)。
平面文件數據庫兩個最大的缺點是索引和原子更新,但如果該域適合這些可能不是問題。
但是,您可以,例如,適當的鎖定,至少在Unix上使用基本文件系統命令進行「原子」索引更新。
一個簡單的情況是讓索引過程在數據中運行,以臨時名稱創建新的索引文件。然後,完成後,只需將新文件重命名(系統調用rename(2)或shell mv命令)舊文件即可。重命名和mv是Unix系統上的原子操作(即它可以工作或不工作,並且在狀態之間永遠不會缺少「)。
與創建新條目相同。基本上將文件完全寫入臨時文件,然後重命名或mv到最後的地方。那麼你從來沒有在「DB」中的「中間」文件。否則,您可能會遇到競爭條件(例如讀取正在寫入的文件的進程,並且在寫入過程完成之前可能會結束 - 比較糟糕的競爭條件)。
如果您的主索引與目錄名稱一起工作良好,那麼工作得很好。例如,您可以使用哈希方案來創建目錄和子目錄以查找新文件。
使用文件名和目錄結構查找文件非常快,因爲現在大多數文件系統都將索引編入目錄。
如果你要將一百萬個文件放在一個目錄中,可能會有一些你想要查找的調整問題,但是出於這個方塊的考慮,大多數文件很容易處理10個。請記住,如果您需要掃描目錄,將會有很多文件需要掃描。通過目錄分區有助於防止這種情況發生。
但是,這一切都取決於您的索引和搜索技術。
實際上,提供靜態內容的現貨供應網絡服務器是一個大型的平面文件數據庫,並且該模型運行良好。最後,當然,你有許多免費的Unix文件系統級別的工具可供你使用,但是它們都有無數的文件(grep 1000000次,在文件中找到某些東西會有性能折衷 - 開銷簡單地加起來)。
如果你的所有文件都在同一個文件系統上,那麼在將相同的文件放在不同的位置(基本上用於索引)方面,硬鏈接也爲你提供了選項(因爲它們也是原子的)。例如,你可以有一個「today」目錄,一個「yesterday」目錄,一個「java」目錄以及實際的消息目錄。因此,可以在「today」目錄,「java」目錄(因爲該帖子標記爲「java」,比如說)以及在它的最後位置(例如/ articles/2008/12)鏈接帖子/01/my_java_post.txt)。然後,在午夜,你運行兩個進程。第一個將「今日」目錄中的所有文件,檢查它們的創建日期以確保它們不是「今天」(因爲該過程可能需要幾秒鐘,並且可能潛入一個新文件),並將這些文件重命名爲「昨天」。接下來,你爲「昨天」目錄做同樣的事情,只是在這裏你只要刪除它們,如果它們過時了。
同時,該文件仍然位於「java」和「.../12/01」目錄中。由於您使用的是Unix文件系統和硬鏈接,因此「文件」只存在一次,這些都只是指向文件的指針。它們都不是「該」文件,它們都是一樣的。
您可以看到,雖然每個單獨的文件移動是原子的,但批量不是。例如,當「today」腳本正在運行時,「yesterday」目錄可以很好地包含「昨天」和「前一天」的文件,因爲「昨天」腳本尚未運行。
在事務性數據庫中,您可以一次完成所有操作。
但是,簡單地說,這是一個久經考驗的方法。特別是,Unix對這個習慣用法非常合適,現代文件系統也可以很好地支持它。
請澄清您對「平面文件」和「基於文件系統」數據庫之間區別的理解。否則,這個問題是無法回答的。 – 2008-12-02 02:51:26
優秀點,在這個問題的情況下,我會看到「平面文件==文件系統爲基礎」例如每個博客條目及其隨附的元數據將在一個文件中。根據文件夾的日期結構來組織許多文件(blogs \ testblog2 \ 2008 \ 12 \ 01)== 12/01/2008 – 2008-12-02 03:19:43