Как стать автором
Обновить

Комментарии 21

Почему бы не воспользоваться профильным решением в виде файлового хранилища на cepf/minio/etc? Все библиотеки есть под c#.

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

Давно студентов заставляют писать статьи на хабр?

Вроде всегда так было, они за это оценки получают

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

Можна было и добавить альтернативное решение.

Ну и System.Drawing точно тянуть не нужно.

Изображения почти всегда огромные объекты по меркам шарпа. Возьмите за практику не материализовывать такие штуки в массив. Везде: в файлах, в web запросах, в запросах к бд изображение выгодно пробросить как стрим. Вы будете приятно удивлены результатом и будете вопрошать "почему я не сделал этого раньше" )

Ага, только нужно тоже понимать, что можно тянуть Stream, а там под катом MemoryStream... Хороше если там будет что-то вроде RecyclableMemoryStream

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

Решение раздувает базу, замедляет работу.
Смоделируйте нагрузку - сгенерите 100,000 бинарников и замерьте разницу во времени ответа и загрузке проца сервера.
Используйте FILESTREAM: SQL Server хранит картинки как файлы на диске, а ссылки в базе.

А еще можно хранить файлы на ФС, а ссылки в базе :)

Можно.
Задача усложняется контролем доступа - в FILESTREAM занимается SQL Server, а в при хранении отдельно - придется заниматься разработчику, включая проблемы безопасности, целостности.
Проходил и бинарник а таблице, в далекие 00, и файлы по-отдельности, когда миллионы документов, и FILESTREAM.
Бинарник а таблице - самое неудачное решение. :)

О, курсовые на хабр подъехали.

О господи вы ещё пользуетесь SQL Server'ом. О господи они хранят бинари в базе. Продолжите список... :)

....еще скажи, они еще не в клауде, и еще не хранят файлы в S3

О господи, в конце 2022 пишут статью как хранить бинари в базе SQL Server. :)

Сохранять в бд путь до картинки не самый оптимальный выход из ситуации, так как это будет работать локально на одном пк и то не всегда

Кто мешает делать это на сервере?

Что значит "не всегда"?

Предположу, что у автора нет никакого сервера.
Сервер - это только Sql Server, а клиент - настольное приложение, которые работает в режиме толстого клиента.

Хранение изображений в БД обычно считается антипаттерном по ряду причин:

  • реляционные базы данных (такие как MS SQL) прежде всего работают в рамках транзакционной модели управления данными - вовлечение BLOB-ов в такую модель снижает её эффективность

  • доставка изображений на фронтенд из БД всегда накладнее, чем доставка из файловых хранилищ

  • доставку изображений на фронтенд сложнее масштабировать (нет возможности использовать CDN)

  • если вам критически важны ваши данные и ваш MS SQL работает в режиме восстановления Full, то все ваши изображения попадут в транзакционный журнал - его размер будет стремительно расти и расходы на его обслуживание возрастут кратно

  • изображения стремительно увеличивают размер БД, что приводит к деградации производительности

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории