代码之家  ›  专栏  ›  技术社区  ›  mercutio

什么时候文件只是文件?

  •  5
  • mercutio  · 技术社区  · 18 年前

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

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

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

    4 回复  |  直到 18 年前
        1
  •  3
  •   willeM_ Van Onsem    10 年前

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

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

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

    双表方法稍微干净一些,只允许文件与具有简单归属关系的正确类型的实体相关联。

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

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

        2
  •  2
  •   SCdF    18 年前

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

    但是,根据您使用的FS,一个目录中的文件数量可能有硬性限制。

        3
  •  2
  •   samjudson    18 年前

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

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

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

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

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

    但最终,这可能取决于交易量和你自己的偏好。

        4
  •  2
  •   Jon Limjap    18 年前

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