Обычно вы не хотите хранить большие файлы в реляционной базе данных - это не то, для чего они предназначены. Я также посоветовал бы использовать решение NoSQL, поскольку они также обычно не предназначены для этого, хотя есть несколько исключений (см. Ниже).
Ваша последняя идея, хранящая файлы в файловой системе (обратите внимание, что это то, что файловые системы - это, предназначенные для;), скорее всего, правильный подход. Это может быть довольно трудно в зависимости от того, что ваши требования масштабируемости, но вы, вероятно, хотите, чтобы пойти с одним из следующих способов:
SAN. SAN обеспечивают резервированные, высокодоступные решения для хранения данных в сети. Несколько серверов могут быть подключены к хранилищу, предоставленному SAN, и обмениваются файлами между собой. Обратите внимание, что это решение, как правило, ориентировано на предприятия и довольно дорого реализуется надежно (вам потребуется как минимум физическое оборудование для него, так и RAID-контроллеры и множество дисков).
CDN. Сеть доставки контента - это удаленная глобально распределенная система для обслуживания файлов конечным пользователям через Интернет. Обычно вы помещаете файл в место на своем сервере, которое затем реплицируется в CDN для фактического распространения. Способ работы CDN заключается в том, что если у него нет файла, который запрашивает пользователь, он автоматически попытается извлечь его с вашего сервера; как только он имеет копию файла один раз, он кэширует файл в течение некоторого периода времени. Это может быть очень полезно, если вы обычно ограничены расходами на пропускную способность или накладные расходы на обработку из-за одновременного обслуживания огромного количества файлов.
Облачные предложения (Amazon S3, Rackspace Cloud Files). Они похожи на CDN, но хорошо работают с существующей облачной инфраструктурой, если это то, что вы используете. Вы отправляете запрос API облака для хранения вашего файла, а затем он становится доступным через Интернет, как с CDN. Основное различие заключается в том, что вы должны вручную обрабатывать любые запросы на хранение (создавать, удалять или обновлять).
Если количество файлов, на которых вы работаете, невелик, вы также можете воспользоваться внутренним решением. Храните файлы на двух или трех серверах (возможно, у вас есть больший набор серверов и используйте хеш-расчет для обхода, если пространство становится проблемой).Создайте небольшой API для ваших внешних серверов, чтобы запрашивать файлы с ваших серверов хранения, возвращаясь к альтернативным серверам, если они недоступны.
Одним из решений, которое я почти забыл (хотя я и не использовал его за пределами исследовательских целей), является проект Luwak от Riak. Luwak является расширением Riak, который является эффективным распределенным хранилищем ключей/значений, который обеспечивает большую поддержку файлов, разбивая большие файлы на сегменты постоянного размера и затем сохраняя эти сегменты в древовидной структуре для быстрого доступа. Это может быть что-то, на что можно смотреть, потому что это дает вам избыточность, осколки и API, которые я упоминал в последнем абзаце бесплатно.