Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

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

Перейдем к сути. Вот как выглядит часть программы на данный момент:
654a8fef3a3af879110407.png

Это список модов. У модов есть описание, тема, версии и т.д., но это не важно. Важно то, что у модов есть картинки. В правой формочке, где написано "Major Experimantals", очень много места и оно как раз таки под картинки. Вот как они хранятся в базе:
654a915c23f72546218912.png

Есть колонка "MainImage", "FirstAdditionalImage", "SecondAdditionalImage" и тут хранятся картинки (тут не все заполнено). Я заполняю их путем прописывания пути, а в коде делаю так:
654a9228289cf106726051.png

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

Картинки - в S3, а перед S3 поставить CDN, чтобы сильно S3 не нагружать.
В центральную базу данных на сервере - только идентификаторы картинок.

Клиент (на WPF) будет обращаться к какому-то приложению, которое написано на ASP NET Core, а оно, в свою очередь, будет идти в центральную БД за всякой инфой.

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



Да, единственный хороший вариант хранить картинки в базе - это не хранить картинки в базе, а хранить лишь пути или идентификаторы картинок.

Главный минус картинок в ФС - это то что они будут привязаны к одному серверу. Лучше хранить картинки в другой системе (S3 или CDN) и хранить в базе их идентификаторы, чтобы потом клиент мог сам их скачать, если это необходимо. Так раздача картинок не будет привязана к основному серверу.

А клиент пусть их кэширует также у себя на диске.

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

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

Ну и клиент на WPF не должен напрямую подключаться к MS SQL.
MS SQL должен находится где-то на сервере и спрятан за каким-то другим web-сервером (который будет написан с использованием ASP NET Core например), который будет уже отвечать за всякую логику.
Если тебе нужна локальная база данных на клиенте (для кэша например), то лучше использовать sqlite.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Ну вообще-то хранение изображений в полях базы данных считается антипаттерном... а по сути - это вообще худшее из возможных решений.

Наилучшее решение - файлы хранятся в FileTables либо FILESTREAM, а в таблице лежат ссылки на них. Что приятно - при этом не надо распыляться с безопасностью, за ней следит SQL Server.

Сравнение параметров для хранения больших двоичных...

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

PS. Пройдя по ссылке - обязательно прочитать и оригинальный ихнеязычный текст. Как, впрочем, и для любого другого машиннопереведённого текста.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы