2013-04-20 57 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

相关问题