Pull to refresh

Comments 38

всё в основном затевалось ради уменьшения нагрузки на дисковую подсистему

И вправду уменьшилось? За счёт чего? Как сильно?

Замеров не производилось, но возникает встречный вопрос: почему нагрузка должна как минимум остаться на том же уровне (или даже вырасти), если была исключена операция по созданию копии обложки?

что добавляет лишнюю операцию: сначала читаем из БД, после чего записываем копию на диск

Общая нагрузка вырастет, поскольку ACID в базах данных достигается достаточно дорогой ценой большего использования диска/памяти/cpu.

Не стану спорить, что в современных СУБД кеширование реализовано отлично и за счёт этого вы получаете более отзывчивую систему. Но вместе с этим вы получаете слишком большую побочную нагрузку, из-за чего с ростом нагрузки и количества blob вы замедлитесь раньше и сильнее, чем при использовании других подходов к хранению.

Общая нагрузка вырастет, поскольку ACID в базах данных достигается достаточно дорогой ценой

Совершенно согласен, накладные расходы в случае БД окажутся несколько выше, о чём, собственно, уже писал ниже:

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

Не упрёка ради, а прояснения для, Ваши изначальные вопросы скорее всего появились из-за беглого прочтения статьи, потому что в этом проекте изображения сразу, изначально находились в базе, поэтому не получится сравнить сделанную оптимизацию с иным способом хранения.

И на всякий случай повторюсь:

Материал не про выбор места хранения, а про неизвестный многим способ извлечения файлов из БД, когда выбор уже сделан не в пользу ФС.

поставить reverse-proxy с кешем перед веб-сервером и отдавать данные картинки прямо из БД (например, кодируя ид в имени файла) и нагрузка на дисковую подсистему именно на операциях чтения картинок упадёт до пренебрежимо малых значений. Такое решение вполне универсальное.

И каково это, использовать унигуй? Как работает? Какие нюансы?

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

На Ваш вопрос наиболее полезно смогут ответить те, кто применяет uniGUI по прямому назначению — переносят настольное приложение в веб, например.

IIS, Delphy, картинки в бд? Ребята, куда то вы не туда свернули.

А куда стоило по вашему мнению? Пойти по дорожке React/Vue и NodeJS? PWA? Или сдуть пыть с Java Servlet?)

Ну как-то вы непонятно спрашиваете. Фронт к дельфям можно любой привязать, судя по всему такой велосипед привязывается неоптимально к чему угодно.

Для начала нормальный веб-сервер взять. Там нет поддержки делфи? Странно, дайте ка подумать почему? Наверное потому потому что никто не пишет на нем сайты? А если пишет, то, наверное, должен понимать очень хорошо этот инструмент? Иначе в ноги настрелаешь. Но судя по тому что уперлись в раздачу картинок складывается впечатление о не очень хорошем понимании работе http и понимании важности асинхронных файловых операций. Упереться в файловые операции? Не в нагрузку на хостинг? Черт подери, да как это можно сделать специально?)) На винде емнип файловые операции медленнее чем на линухе если бенчмарками заниматься.

В данном случае фронтом является uniGui, что совсем "не любой", а тот что позволяет вообще не думать о верстке и веб части в принципе.

Для начала нормальный веб-сервер взять.

Зачем? Насколько я понял IIS нужен чисто как файловое хранилище. Если его возможностей достаточно, нужно ли плодить сущности без необходимости? Не думаю.

Там нет поддержки делфи? Странно, дайте ка подумать почему? Наверное потому потому что никто не пишет на нем сайты?

Чувствуется не предвзятое и взвешенное мнение. :)

Со Java Servlet сдувать пыль не нужно, возьмите Spring Boot. Сейчас — это промышленный стандарт в java

Апач + мод реврайт + правила в .ht* + простейший скрипт и можно любой элемент сайта засунуть в базу. Хоть весь сайт. Останется только индекс как единая точка входа. Проверено)

Главное тут, не создавать никаких файлов! Исключаем дисковые операции. Только память. Кеш на уровне СУБД подкрутить. Надо уметь работать с заголовками.

А если добавить любимый JS Editor, то получим ядро CMS.

Ох уж эти сказочники...

На практике столкнулся с таким "суперским" хранением.

Затейник уже давно не работал в компании, а вот БД выросла до 2ТБ, и к моменту моего прихода продолжала рост и как следствие имела жуткие тормоза.

Реорганизация системы хранения разом избавил от всех этих напастей. Да самих полезных данных в БД осталось 0,5% от первоначальных, остальное стало обычными файлами.

Даже по логике бекапы базы важнее бекапов картинок. Точнее частоту бекапов можно делать разной. Чем легче база тем легче производить по ней любые операции.

У нас админ настроил через Proxmox бэкапы всего контейнера. Я вообще забыл про бэкап базы данных.

В заключение осталось привести новый, значительно облегчённый по сравнению с предыдущим вариантом, код, ибо из БД уже не нужно извлекать само изображение – достаточно лишь получить имя файла с ним (из поля dbo.AlbumCover.name, имеющего в примере псевдоним CoverFileName) и в неизменном виде подставить в атрибут src

прямо напрашивается сравнение вашего решения с обычными файлами в файловой системе

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

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

для стороннего наблюдателя файлы из FileTable и выглядят как настоящие файлы из любой реальной директории

А зачем это всё?

Можно ведь просто сделать <img src="get_file.php?id=123456">, а там простым скриптом брать из базы и возвращать (наверно можно и на asp так же). Без всякой записи в файлы и т.п.

Пыха мало, нужно думать о ресайзе, оптимизации, нужно ли ресайзить заранее и что делать если сайт изменил дизайн…
Надо просто хранить картинки нормально на диске, в нормальной структуре с нормальными именами, а в бд хранить или пути к ним или id.
Отображение делать через прокси какой нибудь imgproxy.net и вопрос каких либо изменений, кеширования, закрыт.
Скорее всего можно (я не знаком с PHP), но каким бы ни был предложенный способ, он же всё равно будет извлекать изображение из базы данных: Ваш скрипт станет делать это, насколько понимаю, через написанный разработчиком SQL-запрос, а вариант из статьи отдаёт всё на откуп самой СУБД (можно сказать, что условным «запросом» выступает просто имя файла).
  1. База закэширует в ОЗУ самые "горячие" файлы.

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

  3. Профит.

Статья же затрагивает вариант, когда они по какой-либо причине находятся в базе данных

ну вот мне и непонятны эти причины

Можно использовать любой S3-совместимый storage или другой тип CDN с нормальным API и нет проблемы с нагрузкой на ФС, заодно и быстрее работать будет, т.к. грузиться будет с ближайшего сервера.

А есть ли вообще преимущество при хранении картинок в БД?

есть. Вы когда возвращаете id товара возвращаете его фотографию прямо в этом же куске кода. На этом все преимущества заканчиваются))) Если это можно назвать преимуществом.

Прикольно. Я вот не знал про такую технологию у MS SQL сервера. Она вряд ли пригодится, но для общего развития интересно. У нас картинки хранятся на диске. В базе только их имена.

Для этого надо было:

  • использовать PHP

  • хранить картинки в файлах

  • настроить кеш

  • отдавать, если не хочется светить имя файла, через параметр скрипта, без всякой возни с настройкой сервера:

    <img src="covers.php?3AE39458-8925-448A-A5F1-0C0A4524ACF0.jpg">

Использовать устаревшие и неподходящие технологии -- это как, хм, танцевать в гамаке и в ластах: можно, сложно, вызывает удивление окружающих, но вряд ли кому-то нужно.

Статья, конечно, хорошая... Но не нужно так делать ни в коем случае!!!

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

Хотите быстро-просто? Храните описания файлов в базе, а содержимое где-нибудь в S3, благо этот протокол много где поддерживается и не завязан целиком на Amazon (можно взять тот же minio, например).

А если хотите получить реальную экономию I/O, то лучше смотрите в сторону HTTP заголовков кеширования и ETag.

Можно было просто cloudflare бесплатный использовать

Прочитав статью, я так и не понял, так смогли ли дрим театровцы в Six Degress... достигнуть новых вершин, или же предыдущий Metropolis II - это конец, вершина их творчества? В смысле, где же лучше хранить файлы?

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

Несомненно смогли. Второй диск - прекрасен, на мой взгляд. Да и дальше есть хорошие альбомы, как минимум Train Of Thought и Octavarium ещё весьма торты.

Обожаю бэкапить базы с картинками, видео и другой фигнёй...

Sign up to leave a comment.

Articles