将图像和文件存储在文件系统还是非 RDBMS 上仍然是最好的选择
Is it still best to store images and files on a file system or non-RDBMS
我正在开发一个系统,可以存储用户的图片,将来还会有一些软文档。
- 用户数:4000+
- 每个用户的成绩单和其他文档:10 MB
- 第一年的总系统需求:40 GB
- 每年额外增加:10%
- 因归档而减少每年:10%
- 在 Ubuntu Linux 系统上本地保存,没有任何花哨的 RAIDS。
- 使用 MySQL 社区版进行应用。
- 并发用户数:10 到 20
- 文件用于历史目的,不会经常访问。
我一直认为由于多层访问等原因,存储在 RDBMS 中很麻烦。但是,由于我们在非 RDBMS 数据库中使用 key/value 对,将文档存储在文件中是否更好系统还是数据库?感谢指点。
大约 7 年前有人问过类似的问题 (storing uploaded photos and documents - filesystem vs database blob)!我希望所有 NoSQL 数据库在技术上都有一些变化。所以,我再问一次。
如果我应该做其他事情而不是提出新问题,请纠正我。
这真的取决于(特别是所考虑的 DBMS,文件系统,它是远程的还是本地的,数据的总大小-PB 与 GB 不同-,users/documents 的数量等) .
如果数据在 1Gb/s 以太网上是远程的,那么网络就是瓶颈。所以使用 DBMS 不会增加显着的额外开销。请参阅 this interesting webpage 的 答案 部分或 STFW,了解 典型 PC 上各种操作的大致时间...
如果数据是本地的,事情就更重要了(但很少有计算机有 1 PB 的 SATA 磁盘)。 Linux 上的大多数文件系统每个文件使用一些最小块大小(例如 1Kbytes、4Kbytes,...)。
一种可能的方法是设置一些阈值(通常为 4 或 8 千字节,甚至可能是 64 千字节,即几页;YMMV)。比它小的数据可能直接是数据库中的一个字段,比它大的数据可能在文件中。数据库有时可能包含数据的 文件路径 。阅读数据库中的 BLOBs。
不仅要考虑 RDBMS,如 PostGreSQL, but also noSQL solutions à la MongoDB, and key-value stores à la REDIS 等
对于本地数据方法,不仅要考虑普通文件,还要考虑 sqlite & GDBM 等。如果您使用文件系统,请考虑避免使用非常宽的目录,因此不要使用 widedir/000001.jpg
。 ... widedir/999999.jpg
将其组织为 dir/subdir000/001.jpg
... dir/subdir999/999.jpg
并且每个目录不超过一千个条目。
如果您在本地使用 MySQL 数据库,并且不考虑大量数据(例如小于 1 TB),您可以直接在数据库中存储任何小于例如 1 TB 的原始数据。 64Kbytes,并将更大的数据存储在单个文件中(其路径进入数据库);但你仍然应该避免为它们使用非常宽的目录。
当然,不要忘记定义和应用(人为决定的)备份程序。
我正在开发一个系统,可以存储用户的图片,将来还会有一些软文档。
- 用户数:4000+
- 每个用户的成绩单和其他文档:10 MB
- 第一年的总系统需求:40 GB
- 每年额外增加:10%
- 因归档而减少每年:10%
- 在 Ubuntu Linux 系统上本地保存,没有任何花哨的 RAIDS。
- 使用 MySQL 社区版进行应用。
- 并发用户数:10 到 20
- 文件用于历史目的,不会经常访问。
我一直认为由于多层访问等原因,存储在 RDBMS 中很麻烦。但是,由于我们在非 RDBMS 数据库中使用 key/value 对,将文档存储在文件中是否更好系统还是数据库?感谢指点。
大约 7 年前有人问过类似的问题 (storing uploaded photos and documents - filesystem vs database blob)!我希望所有 NoSQL 数据库在技术上都有一些变化。所以,我再问一次。
如果我应该做其他事情而不是提出新问题,请纠正我。
这真的取决于(特别是所考虑的 DBMS,文件系统,它是远程的还是本地的,数据的总大小-PB 与 GB 不同-,users/documents 的数量等) .
如果数据在 1Gb/s 以太网上是远程的,那么网络就是瓶颈。所以使用 DBMS 不会增加显着的额外开销。请参阅 this interesting webpage 的 答案 部分或 STFW,了解 典型 PC 上各种操作的大致时间...
如果数据是本地的,事情就更重要了(但很少有计算机有 1 PB 的 SATA 磁盘)。 Linux 上的大多数文件系统每个文件使用一些最小块大小(例如 1Kbytes、4Kbytes,...)。
一种可能的方法是设置一些阈值(通常为 4 或 8 千字节,甚至可能是 64 千字节,即几页;YMMV)。比它小的数据可能直接是数据库中的一个字段,比它大的数据可能在文件中。数据库有时可能包含数据的 文件路径 。阅读数据库中的 BLOBs。
不仅要考虑 RDBMS,如 PostGreSQL, but also noSQL solutions à la MongoDB, and key-value stores à la REDIS 等
对于本地数据方法,不仅要考虑普通文件,还要考虑 sqlite & GDBM 等。如果您使用文件系统,请考虑避免使用非常宽的目录,因此不要使用 widedir/000001.jpg
。 ... widedir/999999.jpg
将其组织为 dir/subdir000/001.jpg
... dir/subdir999/999.jpg
并且每个目录不超过一千个条目。
如果您在本地使用 MySQL 数据库,并且不考虑大量数据(例如小于 1 TB),您可以直接在数据库中存储任何小于例如 1 TB 的原始数据。 64Kbytes,并将更大的数据存储在单个文件中(其路径进入数据库);但你仍然应该避免为它们使用非常宽的目录。
当然,不要忘记定义和应用(人为决定的)备份程序。