2013-04-20 34 views
0

我正計劃實施一個基本的CMS,我將在內部用於自己的開發。我想爲自己的需要開發一個自定義的CMS--這個東西比Dreamweaver更輕便,更便於攜帶,並且冗餘度更低,但是面向已經知道如何編碼並只需要整合信息的人。本質上,計劃是將所有內容都存儲在MySQL數據庫中,將其全部緩存在文件系統中,然後,每當通過提取PHP文件查詢數據時,都會將簡單的查詢發送到數據庫,以檢查資源上次更新的時間,並且如果系統上的緩存文件足夠近,它將從緩存目錄中提取;否則,緩存文件被覆蓋。將所有文件上傳存儲在一個MySQL表中? (TEXT and BLOB)

CMS將存儲數據庫中的所有上傳數據,以便在系統需要移動到另一個主機等時將所有內容都放在一個位置。它還使備份非常簡單,並且可以輕鬆擴展以實現差異/修訂存儲庫等。

我想創建一個包含上傳的所有文件和通過CMS界面創建的資源(頁面,模板等)的單個表格(例如「資產」)。理想情況下,這將處理兩種類型:ASCII(文本)和二進制(BLOB)。

表 「資產」

ID INT,蛞蝓VARCHAR,ASCII LONGTEXT,二進制LONGBLOB,INT類型,元TEXT,修改日期...

我的問題是,是否有意義放這個信息在一個表中? 「資產」表中的任何給定行只有ascii列或二進制列中的值,但從來都不會。這是否浪費了空間?完全放慢流程?

不會不必要地選擇列。 「type」字段將對應於「types」表中的id,它將列出文本類型(html,模板,明文等)和二進制類型(png,jpg,pdf,mp3,mp4等)。所以,我可以查詢,像這樣:

(顯然僞代碼)

$lastModified = SELECT modified FROM assets WHERE slug = $asset_slug; 
if last_modified_date_of_file("cache/$asset_slug") != $lastModified : 
    $type_id = SELECT type FROM assets WHERE id = $asset_id; 
    $type_col = SELECT col FROM types WHERE id = $type_id; 
    if $col == 'ascii' 
    cache_file("cache/$asset_slug", SELECT ascii FROM assets WHERE slug = $asset_slug); 
    else 
    cache_file("cache/$asset_slug", SELECT binary FROM assets WHERE slug = $asset_slug); 

回答

1

一般來說,如果你存儲在數據庫中,你正在做一些錯誤的二進制數據;雖然我很欣賞遷移簡單的願望,但當您將MP3存儲在其中時,您會很快發現數據庫變慢;數據庫經過優化,可快速檢索少量數據,文件系統用於有組織地訪問大量數據。當我實現了類似的系統時,我將文件的位置存儲在數據庫中,文件本身存儲在文件系統中;爲便於攜帶,您可能只想將文件名存儲在「資產」表中,並將路徑存儲到數據庫中其他位置的資產存儲。例如,在經典的「聯繫人卡片」場景中,表格「人物」可能具有「姓名」,「DOB」和「DOB」字樣,位置「,但諸如」電話號碼「之類的數據應該存儲在其他地方,因爲它是與該人相關的數據,而不是該人的屬性。對於您的情況,最好是(IMO)將單獨的表FKing返回到「資產」表以將資產數據鏈接到資產。

+0

即使未選擇/訪問/編制二進制數據,它是否會減慢數據庫速度?就像我說的那樣,我希望將數據存儲在中心位置,但默認情況下它將從文件系統上的緩存文件夾加載。無論如何,你是對的聯繫人的例子。我還沒有決定是否爲資產創建另一個「表格」 - 許多數據會有少量的任意數據,我正在考慮簡單地序列化數據(可能是JSON),並一次從在需要時排。 – 2013-04-21 16:46:57

+0

它只會減慢數據庫的速度,因爲它消除了高效的機會;除非你處於高流量的情況下,這對你來說不太可能是個問題,這只是一團糟! – 2013-04-26 13:04:13

相關問題