2011-10-29 24 views
1

我有多個圖像存儲在URL中,如:/uploads/hash/IMAGE001.jpg。使用jQuery UI的sortable(),我想排序和存儲圖像的順序異步。圖像使用數據庫與文件系統排序

我想出了一些方法來做到這一點,並且很好奇最好的方法是什麼。

我可以爲每個具有3列(ID,IMAGE_URL,IMAGE_INDEX)的/hash/目錄創建一個SQL表並在每種排序中更新表的_INDEX值。然後,我可以通過使用ORDER BY IMAGE_INDEX查詢數據庫來獲取IMAGE_URL的排序列表。

我的另一個想法是命名前面的0000(例如/uploads/hash/0000IMAGE001.jpg)文件。如果我以各種方式在PHP中重命名文件,我可以使用PHP獲取/hash/圖像目錄opendir(),而不需要SQL開銷,然後在客戶機或服務器端按文件名順序排列。

我會遇到任何瓶頸問題與大量的併發文件重命名(vs併發SQL表更新)?從PHP獲取目錄列表的性能與使用ORDER BY查詢SQL有什麼不同?

回答

3

你應該在這種情況下,數據庫排序,

  1. 該數據庫將建立B樹索引和排序保持快速檢索和更新。
  2. 您可以對文件進行範圍查詢。
  3. 您可以更改實際文件的存儲空間,而無需與查找結合使用。
  4. 您可以擴展到與memcachd和分片圖像的數量龐大的多機

的文件系統不進行排序和管理變更設計上。

  1. 雖然文件數量很小時會很快,但排序需要的時間越來越長。
  2. 圖像本身與id密切相關,這限制了靈活性。
  3. 限制你只有一臺機器,一個目錄和操作系統限制,你將不得不通過構建這個越來越多的規模來擴展,最終建立你自己的僞數據庫。
  4. 在服務器上這將是地獄般的,操作系統鎖和併發管理並不像db那麼複雜。

對於任何「真實」的應用程序使用數據庫是如此,使用文件系統是一個快速入侵。

0

數據庫是爲存儲和檢索數據而設計和優化的。更改文件名以存儲數據(如排序順序)通常不是理想的選擇。性能會因文件系統而有很大不同,故障將會是災難性的。在這裏定義數據庫選項。

0

如果您要使用PHP的opendir()獲取文件列表,可以使用一些技巧避免瓶頸。

首先,你可以保持您的列表使用touch()更新文件的修改時間,將下令由opendir()返回列表預排序。

要進一步優化,請使用目錄作爲存儲桶以加速排序。例如,IMAGEDIR/a/,IMAGEDIR/b/等。您可以根據需要開發更高級的目錄樹。

通過系統目錄使用桶排序,它將進行優化,以便爲尚未排序的項目保留單獨的文件夾並批量排序整批。使用包含要整理的整個對象集的子集的存儲桶,通過縮小任何給定的排序操作並使用touch()來保存排序將減少排序算法將運行的次數,從而加快排序列表所需的時間。

相關問題