Зберігання зображень у SQL сервері?


191

Я створив невеликий демонстраційний сайт, і на ньому я зберігаю зображення в стовпці зображень на сервері sql. У мене є кілька питань ...

  • Це погана ідея?

  • Чи вплине це на ефективність роботи мого сайту, коли він виросте?

Альтернативою було б зберігання зображення на диску та збереження лише посилання на зображення в базі даних. Це, мабуть, є загальною дилемою у багатьох людей. Я вітаю поради та дійсно би радий зробити менше помилок, якби міг.


5
Чи є якесь нове доповнення до цього випуску у 2017 році? Це все ще діє на сьогоднішній день?
Хайкал Нашуха

Відповіді:


272

Існує справді хороший документ від Microsoft Research, який називається " Збільшити" або "Не перешкодити" .

Їх висновок після великої кількості тестів на ефективність та аналіз:

  • якщо ваші фотографії або документ зазвичай розміром менше 256 КБ, зберігання їх у базі даних ВАРБІНАРНА колонка є більш ефективною

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

  • між цими двома, це трохи збільшити залежно від вашого використання

Якщо ви вирішили помістити свої зображення в таблицю SQL Server, я настійно рекомендую використовувати окрему таблицю для зберігання цих зображень - не зберігайте фотографії співробітника в таблиці співробітників - зберігайте їх в окремій таблиці. Таким чином, таблиця Співробітників може залишатися худорлявою, середньою і дуже ефективною, припускаючи, що вам не завжди потрібно вибирати фотографію працівника як частину ваших запитів.

Для файлових груп, ознайомтеся з файлами та архітектурою файлових груп . По суті, ви б або створили свою базу даних з окремою групою файлів для великих структур даних з самого початку, або додати додаткову групу файлів пізніше. Назвемо це "LARGE_DATA".

Тепер, коли у вас є нова таблиця, для створення якої потрібно зберігати стовпці VARCHAR (MAX) або VARBINARY (MAX), ви можете вказати цю групу файлів для великих даних:

 CREATE TABLE dbo.YourTable
     (....... define the fields here ......)
     ON Data                   -- the basic "Data" filegroup for the regular data
     TEXTIMAGE_ON LARGE_DATA   -- the filegroup for large chunks of data

Перевірте вступ MSDN у файлових групах та пограйте з ним!


Це добре чи погано… • якщо ваші фотографії або документ зазвичай мають розмір понад 1 Мб, зберігання їх у файловій системі є більш ефективним (а з атрибутом FILESTREAM SQL Server 2008 вони все ще знаходяться під транзакційним контролем і частина бази даних)
htm11h

Чудова відповідь. Якщо ви відчуваєте , як пояснити докладно , чому ви рекомендуєте використовувати спеціальну таблицю для даних зображення, я створив окреме питання для цього на dba.SE .
Хайнзі

15

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

Я знайшов подібне питання

MySQL BLOB vs файл для зберігання малих зображень PNG?

Мій остаточний вердикт полягав у тому, що для таких речей, як малюнок профілю, просто невелике квадратне зображення, яке повинно бути там на кожного користувача, mySQL було б краще, ніж зберігати купу великих пальців у hdd, тоді як для фотоальбомів та подібних речей папки / файли зображень краще.

Сподіваюся, це допомагає


14

Я вважаю за краще зберігати зображення в каталозі, а потім зберігати посилання на файл зображення в базі даних.

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

Докладніше про використання файлових груп можна прочитати тут http://msdn.microsoft.com/en-us/library/ms179316.aspx .


11

Чому може бути добре зберігати зображення в базі даних, а не в каталозі на веб-сервері.

Ви зробили додаток з великою кількістю зображень, що зберігаються у папці на сервері, якими клієнт користується роками.

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

Ви, звичайно, є джерелом і можете просто розгорнути його на новий сервер, встановити SqlServer і відновити базу даних. Але тепер усі картини вже немає.

Якщо ви зберегли зображення в SqlServer, все буде працювати, як і раніше.

Всього мої 2 копійки.


3
Гарна думка. Резервні копії зображень настільки ж важливі, як і резервне копіювання бази даних ... десь навіть тим більше.
Кріс Катіньяні

Також зображення у файловій системі також потребують мережевих дозволів.
Кріс Катіньяні

2
Мережеві дозволи - це хороший момент. Але я не бачу випадку, коли б у вас була резервна копія БД. Напевно у вас є резервна копія програми та файлів. Ви можете так само легко втратити БД, але мати файли.
Норберт Норбертсон



7

Хоча проблеми з ефективністю є дійсними, на практиці справжні причини, що вам слід уникати зберігання зображень у базі даних, є причинами управління базами даних. Ваша база даних буде рости дуже швидко, а бази даних коштують набагато дорожче, ніж просте зберігання файлів. Резервне копіювання та відновлення баз даних значно дорожче і забирає багато часу, ніж відновлення резервного копіювання файлів. У крайньому випадку ви можете відновити меншу базу даних набагато швидше, ніж роздуту зображеннями. Порівняйте 1 ТБ зберігання файлів на Azure з базою даних 1 ТБ, і ви побачите величезну різницю у вартості.


0

На мій досвід, зберігання в URL-адресі до зображень, що зберігаються в іншому місці, - найкращий спосіб для простого проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.