0

我正计划实施一个基本的 CMS,我将在内部用于我自己的开发。我想根据自己的需要开发一个定制的 CMS —— 比 Dreamweaver 更轻、更便携、更少冗余,但面向已经知道如何编码并且只需要整合信息的人。本质上,该计划是将所有内容存储在 MySQL 数据库中,将其全部缓存在文件系统上,然后,每当通过获取 PHP 文件查询数据时,都会向数据库发送一个简单查询,以检查该资源上次更新的时间,如果系统上的缓存文件足够新,则从缓存目录中拉取;否则,缓存文件将被覆盖。

CMS 会将所有上传的内容存储在数据库中,以便在系统需要移动到另一台主机等时将所有内容放在一个位置。它还使备份非常简单,并且可以轻松扩展以实现差异/修订存储库等.

我想创建一个包含通过 CMS 界面创建的所有文件和资源(页面、模板等)的单个表(例如“资产”)。理想情况下,这将处理两种类型:ASCII(文本)和二进制(BLOB)。

表“资产”

id INT,slug 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);
4

1 回答 1

1

一般来说,如果你在数据库中存储二进制数据,你就做错了。虽然我很欣赏让迁移变得容易的愿望,但当您在其中存储 mp3 时,您会很快发现数据库速度变慢;数据库针对快速检索少量数据进行了优化,文件系统针对有组织地访问大量数据进行了优化。当我实现类似的系统时,我将文件的位置存储在数据库中,并将文件本身存储在文件系统中;为了可移植性,您可能只想将文件名存储在“资产”表中,并将资产存储的路径存储在数据库的其他位置。

良好的数据库设计通常意味着将实体的属性从与实体关联的数据中分离出来——例如,在经典的“联系人卡片”场景中,表“人”可能具有“姓名”、“出生日期”和“位置”,但是诸如“电话号码”之类的数据应该存储在其他地方,因为它是与人相关联的数据,而不是人的属性。对于您的情况,最好 (IMO) 将单独的表 FKing 返回到“资产”表以将资产数据链接到资产。

于 2013-04-20T23:25:47.083 回答