![]() |
1
11
我认为您已经准确地捕获了解决此问题的两种最流行的方法。每种方法都有优点和缺点: 将文件存储在数据库中
赞成的意见
欺骗
这种方法非常简单,将文件本身存储在文件系统中。数据库存储对文件位置的引用(以及关于文件的所有元数据)。这里有一个有用的提示,就是为磁盘上的文件标准化命名模式(不要使用用户提供的文件,自己创建一个并将它们存储在数据库中)。 赞成的意见
欺骗最后,我们选择了文件系统路线。它更容易快速实现,备份更容易,一旦我们锁定了任何漏洞并将文件流式传输出去(而不是直接从文件系统提供服务),就相当安全了。它以几乎相同的格式在两个不同的政府应用程序中运行了大约6年。
|
![]() |
2
4
在数据库中存储二进制文件(BLOB)的能力在很大程度上取决于所使用的DBMS。 如果在文件系统上存储二进制文件,则需要考虑在文件名冲突的情况下发生的情况,在这里尝试和存储两个具有相同名称的不同文件,如果这是一个有效的操作。因此,除了引用文件在文件系统中的位置外,您可能还需要存储原始文件名。 此外,如果要存储大量文件,请注意将所有文件存储在一个文件夹中可能会对性能造成的影响。(您没有指定您的操作系统,但可能需要查看 this this ext3的参考。)
这样,我们就得到了一个三级文件夹集,并且这些文件相当分散,因此没有一个文件夹被填满太多。 如果我们 还 之后发生了文件名冲突,我们只需添加“_ N 文件名(在扩展名之前),其中 N 只是一个递增的数字,直到我们得到一个不存在的名称(即使在那个时候,我想我们还是创建了原子文件,只是为了确定)。 当然,然后您需要工具来偶尔将数据库记录与文件系统进行比较,标记任何丢失的文件,并清除数据库记录不再存在的任何孤立文件。 |
![]() |
3
2
只有在确信文件大小不会失控的情况下,才应该将文件存储在数据库中。 我使用我们的数据库来存储小横幅图像,我总是知道它们的大小。您的数据库将在一行中存储一个指向数据的指针,然后将数据本身插入其他位置,因此它不一定会影响速度。 如果有太多的未知因素,那么使用文件系统是更安全的方法。 |
![]() |
4
2
这一切最终取决于实际的用户需求。
数据库膨胀只是一个问题,如果您还没有调整它的大小。做一些测试,看看它有什么影响。磁盘上100GB的文件可能与数据库中相同的文件一样大。 |
![]() |
5
2
此外,您的Web服务器可能比您的应用程序代码更高效地服务文件(以便将文件从DB流回到客户端)。 |
![]() |
6
2
还有一件事需要记住:为了使用您提到的大多数文件类型,您必须:
所有这些都与:
我更喜欢第二组步骤,我自己。 |
![]() |
7
1
我会尝试将其全部存储在数据库中。我没做过。但如果不是的话。文件名与磁盘上的文件不同步的风险很小。那你就有大问题了。 |
![]() |
8
0
attachments 在一个 CouchDB 文档数据库。这将避免文件名冲突问题,因为您将使用生成的UID作为每个文档ID(您将在RDBMS中存储什么),并且实际附件的文件名与文档一起保留。 如果您正在构建一个基于web的系统,那么CouchDB通过HTTP使用REST这一事实也可以被利用。而且,还有一些复制设施可以证明是有用的。 |
![]() |
7BeholdeR7 · 文件夹的重量超过其中的文件(六倍) 3 年前 |
![]() |
ilteris · 为什么程序在fscanf后崩溃 3 年前 |
![]() |
Peaceful · 使用fscanf读取C中具有未知行数的文件 3 年前 |
![]() |
NOCi · 如何将Tensorflow的结果记录到CSV文件 3 年前 |
![]() |
Oakzeh · 如何在字符串索引之前读取文件并删除字符 3 年前 |