Двоичное хранилище MySQL с использованием файловой системы BLOB VS OS: большие файлы, большие количества, большие проблемы

Версии, которые я использую (в основном последний из всего):
PHP: 5.3.1
MySQL: 5.1.41
Apache: 2.2.14
ОС: CentOS (последняя версия)

Вот ситуация.

У меня есть тысячи очень важных документов, от контрактов с клиентами до голосовых подписей (записей авторизации клиентов для контрактов), с типами файлов, включая, но не ограничиваясь, jpg, gif, png, tiff, doc, docx, xls, wav, mp3, pdf и т. д.

Все эти документы в настоящее время хранятся на нескольких серверах, включая 32-битную Windows, CentOS и Mac, среди прочих. Некоторые файлы также хранятся на настольных компьютерах и портативных компьютерах сотрудников, а некоторые до сих пор хранятся в бумажных копиях в сотнях ящиков и картотечных шкафов.

Теперь, поскольку клиенты или юристы могут потребовать доказательства контрактов в любое время, моя компания должна иметь возможность для эффективного поиска и поиска нужного документа (ов), по этой причине ВСЕ эти файлы должны быть оцифрованы (если еще не были) и сопоставлены в некотором порядке для поиска и доступа.

Как программист, я создал полноценный инструмент управления взаимоотношениями с клиентами, который использует вся компания. Это включает в себя управление профилями клиентов, инструменты отслеживания заказов и заданий, модули создания и управления заданиями / продажами и т. Д., А также в настоящий момент любой файл, который необходим на уровне профиля клиента (водительские права, кредитный орган и т. Д.) Или на работе / уровень продажи (контракты, голосовые подписи и т. д.) может быть загружен на сервер и находится в структуре родительской / дочерней иерархии, точно так же, как Windows Explorer или любая другая типичная модель управления файлами.

Структура выглядит так:

drivers_license
Я создал полноценный инструмент управления взаимоотношениями с клиентами, которым пользуется вся компания. Это включает в себя управление профилями клиентов, инструменты отслеживания заказов и заданий, модули создания и управления заданиями / продажами и т. Д., А также в настоящий момент любой файл, который необходим на уровне профиля клиента (водительские права, кредитный орган и т. Д.) Или на работе / уровень продажи (контракты, голосовые подписи и т. д.) может быть загружен на сервер и находится в структуре родительской / дочерней иерархии, точно так же, как Windows Explorer или любая другая типичная модель управления файлами.

Структура выглядит так:

drivers_license
Я создал полноценный инструмент управления взаимоотношениями с клиентами, которым пользуется вся компания. Это включает в себя управление профилями клиентов, инструменты отслеживания заказов и заданий, модули создания и управления заданиями / продажами и т. Д., А также в настоящий момент любой файл, который необходим на уровне профиля клиента (водительские права, кредитный орган и т. Д.) Или на работе / уровень продажи (контракты, голосовые подписи и т. д.) может быть загружен на сервер и находится в структуре родительской / дочерней иерархии, точно так же, как Windows Explorer или любая другая типичная модель управления файлами.

Структура выглядит так:

drivers_license
| - DL_123.jpg
voice_signatures
| - VS_123.wav
| - VS_4567.wav
контракты

Таким образом, файлы загружаются с использованием PHP и Apache и сохраняются в файловой системе ОС. Во время загрузки определенная информация о файле (ах) сохраняется в базе данных MySQL. Некоторая сохраненная информация:

ТАБЛИЦА: FileUploads
FileID
CustomerID (идентификатор клиента, которому принадлежит файл, он есть у всех)
JobID / SaleID (идентификатор связанной работы / продажи, если есть)
Размер файла
FileType
UploadedDateTime
Загружено пользователем
FilePath (путь к каталогу, в котором хранится файл)
FileName (текущее имя загруженного файла, комбинация CustomerID и JobID / SaleID, если применимо.)
Описание файла
OriginalFileName (исходное имя исходного файла при загрузке, включая расширение.)

Итак, как вы можете видеть, файл связан с базой данных по имени файла. Когда я хочу предоставить файлы клиентов для загрузки пользователю, все, что мне нужно сделать, это «ВЫБРАТЬ * ИЗ FileUploads WHERE CustomerID = 123 OR JobID = 2345;» и это выведет все необходимые мне сведения о файле, а с помощью FilePath и FileName я могу предоставить ссылку для загрузки.

http ... server / FilePath / FileName

Там При использовании этого метода возникает ряд проблем:

  1. Хранение файлов в этой среде «база данных без сознания» означает, что целостность данных не сохраняется. Если запись удалена, файл также нельзя удалить, или наоборот.
  2. Файлы разбросаны повсюду, на разных серверах, компьютерах и т. Д.
  3. Имя файла - это ЕДИНСТВЕННАЯ вещь, которая сопоставляет двоичный файл с базой данных, профилем клиента и его записями.

и т. Д. И т. Д. Есть так много причин, некоторые из которых описаны здесь: http: // www.dreamwerx.net/site/article01. Также здесь есть интересная статья: sietch.net/ViewNewsItem.aspx?NewsItemID=124.

Итак, после долгих исследований я в значительной степени решил, что собираюсь хранить ВСЕ эти файлы в базе данных как BLOB или LONGBLOB, но прежде чем я это сделаю, нужно учесть множество соображений.

Я знаю, что сохранение их в базе данных - это жизнеспособный вариант, однако существует ряд методов их хранения. Я также знаю, что хранить их - это одно дело; корреляция и доступ к ним управляемым способом - совсем другое дело.

Статья предоставлена ​​по этой ссылке: dreamwerx. net / site / article01 описывает способ разделения загруженных двоичных файлов на фрагменты по 64 КБ и сохранения каждого фрагмента с FileID, а затем потоковую передачу фактического двоичного файла клиенту с использованием заголовков. Это действительно крутая идея, поскольку она снижает нагрузку на память сервера; вместо того, чтобы загружать весь файл размером 100 МБ в ОЗУ и затем отправлять его клиенту, он делает это за раз по 64 КБ. Я пробовал это (и обновил его скрипты), и это полностью успешно, в очень небольшом объеме тестирования.

Итак, если вы согласны, что этот метод является жизнеспособным, стабильным и надежным долгосрочным вариантом для умеренного хранения большие файлы (от 1 КБ до пары сотен мегабайт) и большое количество этих файлов, дайте мне знать, какие еще соображения или идеи у вас есть.

Кроме того, я подумываю о приобретении текущего «Управления файлами» Сценарий PHP, который предоставляет интерфейс для управления файлами, хранящимися в файловой системе, и преобразования его для управления файлами, хранящимися в базе данных. Если уже существует какое-либо программное обеспечение, которое делает это, пожалуйста, дайте мне знать.

Думаю, я мог бы задать много вопросов, и вся информация там ^^ так что, пожалуйста, обсудите все аспекты этого, и мы сможем передавать идеи вперед и назад и учить друг друга.

Ура,

Quantico773

20
задан Quantico773 11 January 2011 в 03:48
поделиться