Как хранить файлы в базе данных

Как хранить файлы в базе данных

У меня есть 500 000 файлов с общим размером 350 ГБ. Таким образом, средний файл имеет размер 0,7 МБ. Каждый файл имеет метаданные: от 1 до 100 ключевых слов и, возможно, краткое описание. Мне нужно отфильтровать файлы и найти ключевые слова выражения поиска в ключевых словах файлов и в описаниях. Обратите внимание, что некоторые файлы являются текстовыми файлами, поэтому им также нужно найти ключевые слова в файле, что означает полнотекстовый поиск.

  1. Должен ли я хранить метаданные и файлы в одной базе данных или хранить метаданные и текстовые файлы в одной и той же базе данных и двоичные файлы где-то еще?
  2. Какой тип базы данных может хранить столько файлов?

Обратите внимание, что базы данных защищены от RAID, но у меня может быть кеш файловой системы с защитой RAID, поскольку они замедлят потоковую передачу.

Меня интересует только производительность поиска и доступа к файлам, а не согласованность, удобство, безопасность или использование ресурсов. Я могу использовать даже файловую систему, если это ускоряет работу.

2 ответа

Где хранить файлы?

Вопрос о том, следует ли хранить файлы в базе данных, следует рассматривать под несколькими углами:

Консистенция : хранение метаданных и файлов (в виде BLOB) вместе в базе данных гарантирует, что все, что принадлежит вместе, останется вместе. Не бойтесь несогласованности, если вставка перепутана, нет отдельного места хранения для управления абсолютным или относительным URL-адресом в базе данных.

Удобство . Вы можете перемещать /архивировать /реплицировать /контролировать вашу базу данных, если вам нужно просто использовать инструменты базы данных. С отдельными файлами вам необходимо организовать все операции. Это не обязательно сложно, но вы должны позаботиться об этом.

Безопасность . Большинство СУБД предлагают вам некоторые механизмы авторизации для доступа пользователей и даже шифрование, если это необходимо. Таким образом, наличие файла в DMBMS гарантирует, что никто не сжимает файлы, и только те, у кого есть необходимые привилегии DB, могут получить к нему доступ. С отдельными файлами вне базы данных гораздо сложнее организовать это (если только вы не находитесь на сервере, и клиенты не могут напрямую обращаться к папкам).

Производительность: . Это то, что вам нужно тщательно проверить с помощью СУБД, которую вы выберете: API для доступа к BLOB может потребовать некоторые накладные расходы для передачи из /в базу данных в меньшие куски. Поэтому вам нужно быть осторожным, чтобы запрашивать этот объект только в случае необходимости. Здесь с файлами в файловой системе быстрее обращаться к необработанным данным, когда это необходимо. Однако с таким количеством файлов вам, возможно, придется распространять их по нескольким папкам, чтобы не пострадать от производительности поиска каждого имени файла в огромном каталоге.

  • Ресурсы: . Если вы захотите использовать некоторую базу данных в памяти для ускорения вашей «семантической» работы над метаданными, тогда было бы очень дорого хранить все простые данные в памяти. Там отдельные файлы могут быть полезны.
  • Не зная, что именно делает ваша заявка, было бы неразумно советовать вам твердо так или иначе.

    Примеры реальной жизни

    • В моей компании мы используем огромную ERP. Записи финансовых транзакций в базе данных относятся к отсканированным финансовым документам, которые хранятся вне БД на отдельном сервере контента. Сервер контента — это своего рода веб-сервер, который локально хранит файлы изображений (JPG, PDF, . ) в своей локальной файловой системе. Безопасность доступа организована с помощью комплексной схемы проверки URL-адресов.
    • Другая система хранит отсканированные документы для деятельности, не охваченной ERP. Изображения хранятся непосредственно в базе данных.

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

    Читайте также:  Как изменить цвет границ таблицы в powerpoint

    Реляционные или нет?

    Если вы перейдете к реляционной, вы можете захотеть управлять:

    • файлы-записи (например, идентификация, некоторые уникальные метаданные и BLOB).
    • ключевые слова (метаданные + отфильтрованный список текстовых слов)
    • связь ключевых слов с файловыми записями (многие для многих).

    Нет никаких сомнений в том, что производительность и гибкость будут там, потому что поиск ключей, объединение нескольких поисковых запросов и т. д. является основной сферой деятельности РСУБД. Но вам нужно будет разработать, как наилучшим образом структурировать метаданные.

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

    Меня интересует только производительность поиска и доступа к файлам, а не согласованность, удобство, безопасность или использование ресурсов.

    Производительность чтения и записи файлов такого размера (в среднем 0,7 Мб), файловая система, вероятно, быстрее. (Для небольших файлов, например, 0.7Kb, база данных, вероятно, будет быстрее. Типичные файловые системы плохо справляются с большим количеством мелких файлов.)

    Поиск — это другая проблема. Способ быстрого поиска по большому количеству данных — это создание индексов.

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

    Для неструктурированных данных (особенно текста) стандартным решением является использование поисковой системы с открытым текстом. Это работает, создавая обратный индекс для всего корпуса. Это дает вам на порядок лучшую производительность, чем линейное сканирование файлов при каждом поиске. Он может эффективно выполнять поиск с несколькими терминами или поиском фразы.

    Мне кажется, что подход поисковой системы с открытым текстом — это то, что вам нужно. Хорошая текстовая поисковая система также обеспечит способ хранения и поиска метаданных файла.

    Рассмотрим, как мы можем сохранять файлы, в частности, файлы изображений в базу данных. Для этого добавим в базу данных новую таблицу Images с четырьмя столбцами: Id (первичный ключ и идентификатор, имеет тип int), FileName (будет хранить имя файла и имеет тип nvarchar), Title (будет хранить заголовок файла и также имеет тип nvarchar) и ImageData (будет содержать бинарные данные файла и имеет тип varbimary(MAX)).

    Определим код, в котором будут загружаться данные в таблицу:

    После выполнения этой программы в базе данных появится соответствующая запись:

    Извлечение файлов из базы данных

    В прошлой теме мы рассмотрели, как добавить файл в базу данных. Теперь произведем обратную операцию — получим файл из БД. Вначале определим класс файла, который упростит работу с данными:

    Затем в коде программы определим следующий метод:

    В этом методе с помощью SqlDataReader мы получаем значения из БД и по ним создаем объект Image, который потом добавляется в список. И в конце смотрим, если в списке есть элементы, то берем первый элемент и сохраняем его на локальный компьютер. И после сохранения в папке нашей программы появится загруженный из базы данных файл.

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

    Читайте также:  Индикатор на клавиатуре стрелочка вниз

    Комментарии

    Операция не то, чтобы особо ресурсоемкая, просто не нужная.
    1) БД предназначались совсем не для хранения файлов (стандартные), поэтому оптимизации нет.
    2) Намного быстрее выйдет операция когда сервер отдает файл с жесткого, нежели вытаскивает его из БД
    3) В БД файлы занимают больше места, чем на жестком. Тут на 100% не уверен, но несколько раз сталкивался.

    Вывод — однозначно не стоит. Хотя, если БД какая-то особенная (то есть не MySQL, postgreSQL) — можно попробовать.

    Просто есть много-много дискового места, и там стоит БД.
    Но хостин к этому месту невозможен (причины) зато доступ из сети к БД пожалуйста.
    Да и если все в БД хранить, то легко переносить сайты (туда сюда).

    Вообще есть идея как хранить в БД «все» что отражает индивидуальность сайта (шаблоны, модули, локализации, навороты) а один двтижёк (Друпал) все бы это обслуживал.

    Ага, запихиваем в БД php код, потом как надо — достаем его, исполняем ?
    Идея бредовая Хотя все гениальное порой вначале было бредом.

    Ну да, размещаем Drupal в аккаунтах google-почты (gmail.com). Там много места дают и бесплатно. А что, плагин ведь есть, который почтовый ящик gmail в дополнительный диск превращает.

    Я ставлю строчку "php_value error_reporting 7" в файл .htaccess, а вы? Полный русский перевод Drupal 5.x и еще некоторых модулей.

    уже есть и прстейшая cms на основе google-mail

    Блин, опять идею украли!

    Я ставлю строчку "php_value error_reporting 7" в файл .htaccess, а вы? Полный русский перевод Drupal 5.x и еще некоторых модулей.

    • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

    Воруют. (с) известно кто
    Идея применима только в очень узком диапозоне,а так слишком много посредников, отсюда и большая стоимость(нагрузка или время сервера).
    гогля не зря все в плоских файлах хранит.
    ======================================================
    [url=http://wiki.drupal.ru]Документация[/url],[url=http://wiki.drupal.ru/doc/poleznye_ssylki_dlya_dizainerov]Дизайн[/url],[url=http://wiki.drupal.ru/doc/gotovye_perevody]Переводы[/url]

    • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

    А ты на что надеялся? Чтоб идеи не крали, надо их флэшем защищать!

    Грустно, когда не воруют(не интересно) или нечего воровать(исписался)
    ======================================================
    [url=http://wiki.drupal.ru]Документация[/url],[url=http://wiki.drupal.ru/doc/poleznye_ssylki_dlya_dizainerov]Дизайн[/url],[url=http://wiki.drupal.ru/doc/gotovye_perevody]Переводы[/url]

    И в базу складывать. "Иголка в яйце. Яйцо в утке. Утка в. "

    Вообще есть идея как хранить в БД «все» что отражает индивидуальность сайта (шаблоны, модули, локализации, навороты) а один двтижёк (Друпал) все бы это обслуживал.
    Насчет "один движок" — это мультисайтинг, который Drupal умеет. Вся "индивидуальность" собирается при этом в каталоге sites/имясайта, который не так уж и сложно переносить.

    Я ставлю строчку "php_value error_reporting 7" в файл .htaccess, а вы? Полный русский перевод Drupal 5.x и еще некоторых модулей.

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

    Ну помогите же, как грузить все файлы пользователя в БД .

    Насколько понимаю, для этого СУБД должна поддерживать тип BLOB (Binary Large Object) — Двоичный большой объект. Не уверен, что MySQL это может.

    Поиск по русским сайтам о Drupal Полный русский перевод Drupal 5.x и модулей: раз и два.

    Может. Drupal их активно юзает, например в таблице locales_source поле source имеет тип blob.
    Чтобы хранить файлы в БД, думю надо переписать file API Drupal. Может есть и проще решение.

    Тады — ой!

    Поиск по русским сайтам о Drupal Полный русский перевод Drupal 5.x и модулей: раз и два.
    Читайте также:  Pl sql developer кодировка

    А модуля нет подобного .
    Или тогда где находится это file API Drupal .

    Не по теме: есть такая БД Cache (широко известная в узких кругах) так в ней БЛОБы это чуть ли не основной тип данных, и рекомендации в описаниях БД хранить гигабайтное потоковое видео и аудио. Вроде даже доступ быстрее чем из файловой системы. Вообще я тоже склоняюсь что файловые системы умрут, все и вся будут обращаться и хранить в БД.

    Доступ не может быть быстрее, чем к файловой системе по определению(если только db не держит огромный кэш в памяти). Или SQL сам является частью системы.
    А тут вспоминается старая реприза: ‘достаёт кошёлку, открывает кошёлку, достает сумочку, закрывает кошёлку открывает сумочку достает кошелек закрывает сумочку . ‘
    ======================================================
    [url=http://wiki.drupal.ru]Документация[/url],[url=http://wiki.drupal.ru/doc/poleznye_ssylki_dlya_dizainerov]Дизайн[/url],[url=http://wiki.drupal.ru/doc/gotovye_perevody]Переводы[/url]

    > Или тогда где находится это file API Drupal .
    includes/file.inc
    api.drupal.org

    > Вообще я тоже склоняюсь что файловые системы умрут, все и вся будут обращаться и хранить в БД.
    Любая файловая система является базой данных, только очень ограниченой. Если посмотреть на развитие ФС, то можно увидеть, что они всё больше становятся похожи на БД.

    ««Доступ не может быть быстрее, чем к файловой системе по определению.»» —

    А если БД установлена прямо на ЖД минуя ФС. То доступ может быть быстрее ?!

    ««(если только db не держит огромный кэш в памяти). Или SQL сам является частью системы.»» —

    В Cache они пишут что «не побайтная, а побитная оптимизация». И SQL там вроде как «фасад» то есть при получении запроса SQL, БД раскраивает запрос в свой «язык, алгоритм, программу», оптимизирует, кэширует и проч. SQL нужен чтобы донести задание, а далее БД не по SQLю живет. Вообще к Cache можно обратится «очень по разному» и SQL, как они говорят «только один ИЗ способов».
    Все это общее мое рассуждение, за конкретными вещами обращайтесь к документации.

    ««> Или тогда где находится это file API Drupal .
    includes/file.inc
    api.drupal.org
    »» —

    спасибо, но чтобы там править надо хорошо внутреннюю структуру Друпала знать.
    Пойду поищу модуль.

    А если БД установлена прямо на ЖД минуя ФС. То доступ может быть быстрее ?!

    Вообще-то база данных это тоже файл(ы) лежащий на жестком диске и установить БД минуя ФС невозможно. Почитай эту ссылку.

    я же писал что это только мои домыслы.
    но где то слышал что может.

    А вот гибрид ФС и БД есть (вернее был) когдато у Sun.
    Там был прямой доступ к полям(текстовым) в файле.

    • Войдите или зарегистрируйтесь, чтобы отправлять комментарии

    Трекер

    Вопросы на будущее (миграция на 8 и 9 версии)

    Нет возможности добавить термин в словарь таксономии. Как разблокировать эту возможность?

    Как поправить переменную breadcrumb

    Перевод материалов

    Как проверить работоспособность формы обратной связи?

    Нужно оптимизировать Drupal 7 на nginx

    Как отфильтровать содержимое по полю в профиле пользователя?

    Как подставить поле формы в нужное место?

    Обновление PHP до версии 7.2

    Как свернуть поле с вложением на странице

    Новые материалы

    Как поправить переменную breadcrumb

    Нужно оптимизировать Drupal 7 на nginx

    Вопросы на будущее (миграция на 8 и 9 версии)

    Как проверить работоспособность формы обратной связи?

    Как отфильтровать содержимое по полю в профиле пользователя?

    Обновление PHP до версии 7.2

    Перевод материалов

    Как подставить поле формы в нужное место?

    Private Message. Ссылка в views, настройки текстового поля, уведомление пользователя.

    Views фильтры и связи

    Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

    Ссылка на основную публикацию
    Как узнать свой smtp сервер
    В процессе настройки почтовых программ Вам потребуется указать следующую информацию: адрес электронной почты, сервер входящей почты, сервер исходящей почты, имя...
    Как стать администратором страницы facebook
    При наличии раскрученной группы в социальной сети Facebook могут возникать трудности с управлением из-за недостатка времени и сил. Решить подобную...
    Как транслировать экран iphone на mac
    Если вам потребовалось вывести изображение с iPhone на ПК или ноутбук по Wi-Fi, сделать это сравнительно просто: доступны программы Windows...
    Как узнать резервный пин код
    Резервный пин-код LG для разблокировки любых телефонов, что делать, если потерян пароль, забыт графический ключ, и необходим доступ к данным....
    Adblock detector