代码之家  ›  专栏  ›  技术社区  ›  Aaron Daniels

将文件与数据关联的最佳方式是什么?

  •  7
  • Aaron Daniels  · 技术社区  · 16 年前

    • 我应该存储文件的内容吗 数据库中的文件?这不是吗

    • 我应该将文件存储在文件中吗 服务器,并将路径存储在 数据库

    8 回复  |  直到 16 年前
        1
  •  11
  •   Community CDub    5 年前

    我认为您已经准确地捕获了解决此问题的两种最流行的方法。每种方法都有优点和缺点:

    将文件存储在数据库中

    赞成的意见

    • 简化了数据的备份:您可以备份所有文件所在的数据库。

    欺骗

    • 当您将所有二进制数据存储到数据库中时,备份可能很快成为一场巨大的噩梦。通过将文件保存在单独的数据库中,可以减轻一些麻烦。
    • 一般来说,与文件系统相比,编码和协调数据到数据库的上传和存储更加困难。

    这种方法非常简单,将文件本身存储在文件系统中。数据库存储对文件位置的引用(以及关于文件的所有元数据)。这里有一个有用的提示,就是为磁盘上的文件标准化命名模式(不要使用用户提供的文件,自己创建一个并将它们存储在数据库中)。

    赞成的意见

    • 易于维护文件本身(如果需要更改或更新文件),可以在文件系统本身中进行。您也可以通过新的上传从应用程序轻松地完成。

    欺骗

    最后,我们选择了文件系统路线。它更容易快速实现,备份更容易,一旦我们锁定了任何漏洞并将文件流式传输出去(而不是直接从文件系统提供服务),就相当安全了。它以几乎相同的格式在两个不同的政府应用程序中运行了大约6年。

        2
  •  4
  •   Community CDub    8 年前

    在数据库中存储二进制文件(BLOB)的能力在很大程度上取决于所使用的DBMS。

    如果在文件系统上存储二进制文件,则需要考虑在文件名冲突的情况下发生的情况,在这里尝试和存储两个具有相同名称的不同文件,如果这是一个有效的操作。因此,除了引用文件在文件系统中的位置外,您可能还需要存储原始文件名。

    此外,如果要存储大量文件,请注意将所有文件存储在一个文件夹中可能会对性能造成的影响。(您没有指定您的操作系统,但可能需要查看 this this ext3的参考。)

    这样,我们就得到了一个三级文件夹集,并且这些文件相当分散,因此没有一个文件夹被填满太多。

    如果我们 之后发生了文件名冲突,我们只需添加“_ N 文件名(在扩展名之前),其中 N 只是一个递增的数字,直到我们得到一个不存在的名称(即使在那个时候,我想我们还是创建了原子文件,只是为了确定)。

    当然,然后您需要工具来偶尔将数据库记录与文件系统进行比较,标记任何丢失的文件,并清除数据库记录不再存在的任何孤立文件。

        3
  •  2
  •   Kevin Laity    16 年前

    只有在确信文件大小不会失控的情况下,才应该将文件存储在数据库中。

    我使用我们的数据库来存储小横幅图像,我总是知道它们的大小。您的数据库将在一行中存储一个指向数据的指针,然后将数据本身插入其他位置,因此它不一定会影响速度。

    如果有太多的未知因素,那么使用文件系统是更安全的方法。

        4
  •  2
  •   Brody    16 年前

    这一切最终取决于实际的用户需求。

    数据库膨胀只是一个问题,如果您还没有调整它的大小。做一些测试,看看它有什么影响。磁盘上100GB的文件可能与数据库中相同的文件一样大。

        5
  •  2
  •   cherouvim    16 年前

    此外,您的Web服务器可能比您的应用程序代码更高效地服务文件(以便将文件从DB流回到客户端)。

        6
  •  2
  •   Ken White    16 年前

    还有一件事需要记住:为了使用您提到的大多数文件类型,您必须:

    • 查询数据库以获取blob中的文件内容
    • 将blob数据写入磁盘文件
    • 启动一个应用程序来打开/编辑/任何您刚刚创建的文件

    所有这些都与:

    • 从数据库读取文件路径

    我更喜欢第二组步骤,我自己。

        7
  •  1
  •   Flinkman    16 年前

    我会尝试将其全部存储在数据库中。我没做过。但如果不是的话。文件名与磁盘上的文件不同步的风险很小。那你就有大问题了。

        8
  •  0
  •   Evan    16 年前

    attachments 在一个 CouchDB 文档数据库。这将避免文件名冲突问题,因为您将使用生成的UID作为每个文档ID(您将在RDBMS中存储什么),并且实际附件的文件名与文档一起保留。

    如果您正在构建一个基于web的系统,那么CouchDB通过HTTP使用REST这一事实也可以被利用。而且,还有一些复制设施可以证明是有用的。

    some