【问题标题】:When is a file just a file?什么时候文件只是一个文件?
【发布时间】:2010-09-06 06:32:34
【问题描述】:

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

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

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

【问题讨论】:

    标签: database-design


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        其次,安全性可能是一个问题 - 如果某些要公开查看(例如个人资料照片)而其他不公开(例如简历),则将它们放在不同的目录中会更易于管理。

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

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-15
            • 2012-01-08
            • 1970-01-01
            • 2020-09-06
            • 1970-01-01
            • 2015-01-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多