因此,您正在编写一个 Web 应用程序,并且网站上有多个区域可供用户上传文件。我的基本工作方法是将实际文件存储在服务器上,并有一个数据库表将存储的文件名与其相关的记录连接起来。

我的问题是这样的:每种“类型”的文件是否应该有不同的表?另外,文件应该存储在服务器上与上下文相关的位置,还是全部存储在一起?

一些例子:用户个人资料照片、职位申请简历、CMS 页面上的相关文档等。

有帮助吗?

解决方案

从您的示例中,有两个表的参数,因为您有可以与两个不同事物关联的文件。

  • 简历、照片与用户相关联。
  • 附件与 CMS 页面关联。

如果您将这些放在一张表中(并且您希望允许用户拥有多于一张照片或简历),那么您需要两个链接表来关联文件->用户和文件->cms_pages。可以说,这意味着 HABTM 关系,这是不正确的并且允许不一致的数据。

两个表的方法稍微干净一些,只允许文件通过简单的belongsTo关系与正确类型的实体相关联。

但我认为这个问题没有任何“正确”的答案,除非您需要为不同的文件类型存储不同类型的元数据。

还要确保存储或能够计算每个文件的 mimetype,以便可以使用正确的 HTTP 标头将其正确返回到浏览器。

其他提示

根据您所说,我只会将具有随机(UUID 或其他)文件名的文件存储在一个地方。然后我会有一个“附件”表或包含对所有外部文件的引用的内容。该表还包含该文件的元数据,例如文件类型(图片、简历等)等等。

不过,一个目录中的文件数量可能存在硬性限制,具体取决于您使用的文件系统。

将不同文件存储在不同位置可能有多种原因。

首先,一个目录中文件数量的限制可能是一个考虑因素。

其次,安全可能是一个问题 - 如果有些是公开可见的(例如个人资料照片),但其他则不是(例如简历),那么将它们放在不同的目录中会更容易管理。

第三,如果文件被拆分,例如在文件资源管理器中浏览,或管理备份,或修改应用程序以跨多个位置拆分文件存储,则简单的管理任务可能会更容易。

还有文件名冲突的问题,但如果您重命名所有内容以匹配数据库 ID 字段(例如),那么这将不是问题。

但归根结底,这可能取决于数量和您自己的喜好。

仅当您为每种文件类型存储其他元数据(因此还有附加列)时,每种文件类型的不同表才变得相关。如果每种文件类型的表仅包含相同的列(例如文件名、文件类型、上传日期等),那么将它们全部放在一张表中是有意义的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top