Зберігати зображення як файли чи в базі даних для веб-програми?


124

Моє запитання досить загальне, і я знаю, що на нього може бути не 100% відповіді. Я будую веб-рішення ASP .NET, яке буде містити багато фотографій і, сподіваюся, неабияку кількість трафіку. Я дуже хочу досягти продуктивності.

Чи потрібно зберігати зображення в базі даних або у файловій системі? І незалежно від відповіді мене більше цікавить, чому вибирати конкретний шлях.

Велике спасибі, Стефане

ДУПЛІКАТ : Зберігання зображень у БД - так чи ні? , Як зберігати зображення у вашій файловій системі , Зберігаючи невелику кількість зображень: blob або fs? і, мабуть, деякі інші.


КОМЕНТАР: Дякую за багато хороших відповідей. Я буду шукати файлове рішення, навіть якщо мені подобається ідея мати 100% -ве рішення, кероване базами даних. Здається, що сьогодні є хороші рішення робити те, що я хочу, з базами даних тощо, але у мене є кілька причин цього не робити.

  • Я буду приймати рішення, у мене величезна кількість пам’яті (10 Гб), але лише 300 Мб для бази даних. Це займе багато для додаткового зберігання в БД.

  • Я не експерт з БД, а також не контролюю налаштування БД. Рішення на базі БД може потребувати спеціальної конфігурації, як це виглядає.

Якщо ми перейдемо до запуску сайту на власному сервері, я можу розглянути рішення на базі БД. спасибі, Стефане


1
Вкажіть, будь ласка, базу даних, яку ви використовуєте.
Геррі Шенк

1
Я маю намір використовувати MSSQL пізнішої версії.
StefanE

1
@StefanE, Файлова система - за всіма намірами та цілями - спеціалізована база даних, оптимізована для зберігання файлів.
ЛукаH

Відповіді:


175

Зберігайте зображення у файловій системі та місця розташування зображень у базі даних.

Чому? Тому що...

  1. Ви зможете подавати фотографії як статичні файли.
  2. Для отримання зображень не потрібен доступ до бази даних або код програми.
  3. Зображення можна подавати з іншого сервера для підвищення продуктивності.
  4. Це зменшить вузьке місце бази даних.
  5. База даних в кінцевому рахунку зберігає свої дані у файловій системі.
  6. Зображення можна легко кешувати, якщо вони зберігаються у файловій системі.

1
Крім того, у SQL Server, коли ви зберігаєте зображення як поле "Зображення", це ефективно, що робить SQL - десь зберігає вказівник на файл на диску. Ось так воно обходить межу сторінки в 8 КБ.
Джаф - Бен Дюгід

9
Це на самому справі було вирішити , є SQL Server 2008. Був новий тип введений FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx який сіточки , щоб скористатися «продуктивність файлової системи і в той же час підтримувати транзакційна узгодженість між неструктурованими даними та відповідними структурованими даними "
Крістоф

Так, ти прав. моє запитання, який розмір краплі? або скільки пам'яті вона може зберігати?
Амеєр

11

У своїх нещодавно розроблених проектах я зберігав зображення (і всі види двійкових документів) як стовпці зображень у таблицях баз даних.

Перевага наявності файлів, що зберігаються в базі даних, очевидно, що ви не закінчуєте нереференційними файлами на жорсткому диску, якщо запис видалено, оскільки синхронізація між базою даних (= метадані) та жорстким диском (= зберігання файлів) не вбудована і повинен бути запрограмований вручну.

Використовуючи сучасну технологію, я пропоную вам зберігати зображення в стовпцях FILESTREAM SQL Server 2008 (принаймні, це я буду робити зі своїм наступним проектом), оскільки вони поєднують в собі перевагу зберігання даних у базі даних та великі бінарні файли в окремих файлах (на принаймні відповідно до реклами;))


Ви ще протестували функціональність Filestream?
StefanE

1
Насправді, при видаленні запису БД, можна кодувати також для видалення з файлової системи. Тож я вважаю за краще зберігати в FS, а не в DB
kailash19

9

Прислів’я завжди було "Файли у файловій системі, метадані файлів у базі даних"


6

Краще зберігати файли як файли. Різні бази даних по-різному обробляють дані Blob, тому якщо вам доведеться перенести задній край, ви можете потрапити в проблеми.

Під час подачі значень <img src = у файл, який вже існує на сервері, швидше за все, буде швидше, ніж створення тимчасового файлу з поля бази даних та вказівка ​​на тег <img на це.

Я знайшов цю відповідь, погугливши своє запитання та прочитавши коментарі на веб- сайті http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html


1
Згаданий пост видається трохи застарілим.
девіо

6

Я зазвичай люблю мати у базі даних двійкові файли, оскільки:

  • цілісність даних: немає файлів, що не відносяться, жодного шляху в db без жодного файлу
  • узгодженість даних: візьміть дамп бази даних, і це все. ні "O, я забув targz цей каталог даних."

4

Зберігання зображень у базі даних додає накладні витрати БД для обслуговування окремих зображень і ускладнює завантаження на чергування сховища (S3, Akami), якщо ви зростаєте до цього рівня. Зберігання їх у базі даних значно полегшує переміщення вашої програми на інший сервер, оскільки зараз переміщувати лише БД.

Зберігання зображень на диску полегшує завантаження на чергування, робить зображення статичними елементами, тому вам не доведеться возитися з заголовками HTTP у веб-додатку, щоб зробити зображення кешованими. Мінус полягає в тому, що якщо ви коли-небудь переміщаєте додаток на інший сервер, вам потрібно пам’ятати і про переміщення зображень; щось легко забути.


3

Для веб-додатків ви отримаєте кращу ефективність використання файлової системи для зберігання зображень. Це дозволить вам легко реалізувати кешування зображень на кількох рівнях у вашій програмі. Є деякі переваги зберігання зображень у базі даних, але більшість випадків ці переваги стосуються клієнтських додатків.


0

Просто додати ще трохи до вже хороших відповідей. Ви все ще можете отримати переваги кешування як з веб-рівня, можливо, так і з рівня бази даних, якщо ви переходите по маршруту, зберігаючи зображення в базі даних.

Я думаю, що для бази даних ви можете цього досягти, зберігаючи зображення відносно пов'язаних з ними текстових даних і якщо ви можете отримати доступ до зображень у конкретний запит, щоб база даних змогла кешувати запит (просто теорія, хоча так не соромтеся обманювати мене на цій частині).

Що стосується веб-сторінки, я б здогадався, оскільки у вас питання позначено asp.net, що ви підете маршрутом використання http обробника для подання зображень. Тоді ви маєте всі переваги рамки у вашому розпорядженні, і ви зможете утримувати вашу логіку домену чистішою лише з тим, щоб передати ключ свого зображення до обробника http.


-1

Чому б не вибрати окрему базу даних NoSql для зберігання ваших файлів.

Він надає вам цілісність даних, узгодженість даних, як згадується @chburd.

Поки ви rdbms все ще зберігаєте малий.


-1
  1. Ось покроковий приклад (загальний підхід, реалізація весни Eclipse) зберігання зображень у файловій системі та зберігання їх метаданих у БД - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Ось і приклад - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Також ви можете дослідити кодову базу цього проекту - https://github.com/jdmr/fileUpload . Зверніть увагу на цей контролер.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.