mysql - 将所有上传的文件存储在一张 MySQL 表中? (文本和 BLOB)

标签 mysql text blob sql-types

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

CMS 将把所有上传内容存储在数据库中,这样,如果系统需要移动到另一台主机等,所有内容都在一个地方。它还使备份变得非常简单,并且可以轻松扩展以实现差异/修订存储库等

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

表“ Assets ”

id INT、slug VARCHAR、ascii LONGTEXT、二进制 LONGBLOB、类型 INT、元 TEXT、修改的 DATE,...

我的问题是,将这些信息放在一张表中有意义吗? “ Assets ”表中的任何给定行只能在 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);

最佳答案

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

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

关于mysql - 将所有上传的文件存储在一张 MySQL 表中? (文本和 BLOB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16126211/

相关文章:

php - 如何在php中格式化纯文本?

android - 从 Android sqlite 数据库中检索大 blob

javascript - Windows 运行时 Javascript 应用程序 - 启动 Javascript 文件

MySQL过滤来自没有内容的外键的结果

mysql - Sqoop - 在导入到 HDFS 之前操作 Mysql 表

java - JDBC PreparedStatement 始终返回 1 作为自动生成的键

c++ - 是否有用于 80 列格式化文本输出的库/方法?

ios - System.setClipboard不适用于iOS(AS3)

mysql - AES_DECRYPT 从 typescript 中的 blob 获取值

MySQL一对多映射查询-如果匹配很多,不返回一个