Przechowujesz obrazy w SQL Server?

191

Zrobiłem małą stronę demonstracyjną i na niej przechowuję obrazy w kolumnie obrazu na serwerze sql. Mam kilka pytań ...

  • Czy to zły pomysł?

  • Czy wpłynie to na wydajność mojej witryny, gdy będzie rosła?

Alternatywą byłoby przechowywanie obrazu na dysku i przechowywanie wyłącznie odwołania do obrazu w bazie danych. To musi być powszechny dylemat wielu ludzi. Z radością powitałbym kilka rad, a gdybym mógł, z przyjemnością popełniłbym mniejszy błąd.

marko
źródło
5
Czy jest jakiś nowy dodatek do tego wydania w 2017 roku? Czy to nadal obowiązuje na dzień dzisiejszy?
Haikal Nashuha,

Odpowiedzi:

272

Istnieje naprawdę dobry artykuł firmy Microsoft Research o nazwie To Blob lub Not To Blob .

Ich wnioski po dużej liczbie testów wydajności i analiz są następujące:

  • jeśli twoje zdjęcia lub dokumenty mają zwykle rozmiar mniejszy niż 256 KB, przechowywanie ich w kolumnie VARBINARY bazy danych jest bardziej wydajne

  • jeśli twoje zdjęcia lub dokumenty mają zwykle ponad 1 MB, przechowywanie ich w systemie plików jest bardziej wydajne (a dzięki atrybutowi FILESTREAM programu SQL Server 2008 nadal są one kontrolowane transakcyjnie i stanowią część bazy danych)

  • pomiędzy tymi dwoma, jest to trochę podrzucenie w zależności od twojego zastosowania

Jeśli zdecydujesz się umieścić swoje zdjęcia w tabeli programu SQL Server, zdecydowanie zalecam użycie osobnej tabeli do przechowywania tych zdjęć - nie przechowuj zdjęcia pracownika w tabeli pracownika - przechowuj je w osobnej tabeli. W ten sposób stół pracownika może pozostać szczupły, wredny i bardzo wydajny, zakładając, że nie zawsze musisz wybierać zdjęcie pracownika również w ramach twoich zapytań.

W przypadku aplikacjami zapoznaj się z wprowadzeniem Pliki i architektura aplikacjami. Zasadniczo albo utworzysz bazę danych z osobną aplikacją dla dużych struktur danych od samego początku, albo dodasz dodatkową grupę plików później. Nazwijmy to „LARGE_DATA”.

Teraz, gdy masz nową tabelę do utworzenia, która musi przechowywać kolumny VARCHAR (MAX) lub VARBINARY (MAX), możesz określić tę grupę plików dla dużych danych:

 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

Sprawdź wprowadzenie MSDN na aplikacjach internetowych i baw się z nim!

marc_s
źródło
Czy to dobrze, czy źle .... • jeśli zdjęcia lub dokumenty mają zwykle ponad 1 MB, przechowywanie ich w systemie plików jest bardziej wydajne (a dzięki atrybutowi FILESTREAM programu SQL Server 2008 nadal są one kontrolowane transakcyjnie i część bazy danych)
htm11h
Świetna odpowiedź. Jeśli czujesz, wyjaśniając szczegółowo dlaczego polecacie użyć dedykowanego tabela danych obrazu, mam stworzony oddzielny pytanie, które na dba.SE .
Heinzi
15

Raz wpadłem w ten dylemat i sporo szukałem w Google opinii. Odkryłem, że rzeczywiście wielu widzi lepiej zapisywanie obrazów na dysku dla większych obrazów, podczas gdy mySQL pozwala na łatwiejszy dostęp, szczególnie z języków takich jak PHP.

Znalazłem podobne pytanie

MySQL BLOB vs plik do przechowywania małych obrazów PNG?

Mój ostateczny werdykt był taki, że w przypadku takich rzeczy, jak zdjęcie profilowe, tylko mały kwadratowy obraz, który musi być tam na użytkownika, mySQL byłoby lepsze niż przechowywanie garści kciuków na dysku twardym, podczas gdy w przypadku albumów ze zdjęciami i podobnych rzeczy folderów Pliki / image są lepsze.

Mam nadzieję, że to pomoże

Kevin Chavez
źródło
14

Wolałbym przechowywać obraz w katalogu, a następnie przechowywać odniesienie do pliku obrazu w bazie danych.

Jeśli jednak przechowujesz obraz w bazie danych, powinieneś podzielić bazę danych na partycje, aby kolumna z obrazem znajdowała się w osobnym pliku.

Możesz przeczytać więcej o korzystaniu z aplikacjami tutaj http://msdn.microsoft.com/en-us/library/ms179316.aspx .

John Hartsock
źródło
11

Dlaczego warto przechowywać zdjęcia w bazie danych, a nie w katalogu na serwerze WWW.

Utworzyłeś aplikację z dużą ilością zdjęć przechowywanych w folderze na serwerze, z którego klient korzystał od lat.

Teraz przychodzą do ciebie. Serwer został zniszczony i muszą go przywrócić na nowym serwerze. Nie mają już dostępu do starego serwera. Jedyne, co mają, to kopia zapasowa bazy danych.

Masz oczywiście źródło i możesz go łatwo wdrożyć na nowym serwerze, zainstalować SqlServer i przywrócić bazę danych. Ale teraz wszystkie zdjęcia zniknęły.

Jeśli zapisałeś zdjęcia w SqlServer, wszystko będzie działało jak poprzednio.

Tylko moje 2 centy.

Erling Ervik
źródło
3
Słuszna uwaga. Kopie zapasowe obrazów są tak samo ważne jak tworzenie kopii zapasowych bazy danych ... czasami nawet bardziej.
Chris Catignani,
Również obrazy w systemie plików wymagają uprawnień sieciowych.
Chris Catignani,
2
Uprawnienia sieciowe to dobra uwaga. Ale nie widzę przypadku, w którym miałbyś tylko kopię zapasową bazy danych. Na pewno będziesz mieć kopię zapasową aplikacji i plików. Możesz równie łatwo stracić DB, ale mieć pliki.
Norbert Norbertson
7

Chociaż problemy z wydajnością są ważne, prawdziwymi przyczynami, dla których należy unikać przechowywania obrazów w bazie danych, są przyczyny zarządzania bazą danych. Twoja baza danych rośnie bardzo szybko, a bazy danych kosztują znacznie więcej niż zwykłe przechowywanie plików. Tworzenie kopii zapasowych i przywracanie danych jest znacznie droższe i czasochłonne niż w przypadku przywracania kopii zapasowych plików. W skrócie, możesz przywrócić mniejszą bazę danych znacznie szybciej niż nadęty z obrazami. Porównaj 1 TB przestrzeni dyskowej na platformie Azure z bazą danych 1 TB, a zobaczysz ogromną różnicę w kosztach.

J Miglietta
źródło
0

Z mojego doświadczenia wynika, że ​​przechowywanie do adresu URL obrazów przechowywanych w innym miejscu jest najlepszym sposobem na prosty projekt.

Beverly Ukandu
źródło