Przechowywać zdjęcia jako pliki lub w bazie danych aplikacji internetowej?

124

Moje pytanie jest dość ogólne i wiem, że może nie być odpowiedzi w 100%. Tworzę rozwiązanie internetowe ASP .NET, które będzie zawierało dużo obrazów i, miejmy nadzieję, sporo ruchu. Naprawdę chcę osiągnąć wydajność.

Czy powinienem zapisywać obrazy w bazie danych czy w systemie plików? I niezależnie od odpowiedzi, bardziej interesuje mnie, dlaczego wybrać konkretny sposób.

Wielkie dzięki, Stefan

DUPLIKAT : Przechowywanie obrazów w DB - Tak czy nie? , Jak przechowywać obrazy w systemie plików , Przechowywać niewielką liczbę obrazów: blob czy fs? i prawdopodobnie kilka innych.


KOMENTARZ: Dzięki za wiele dobrych odpowiedzi. Zdecyduję się na rozwiązanie oparte na plikach, nawet jeśli podoba mi się pomysł posiadania rozwiązania opartego w 100% na bazie danych. Wygląda na to, że są dzisiaj dobre rozwiązania, aby robić to, co chcę z bazami danych itp., Ale mam kilka powodów, aby tego nie robić.

  • Będę na rozwiązaniu hostowanym, mam ogromną ilość pamięci (10 GB), ale tylko 300 MB na bazę danych. Dodatkowa pamięć w bazie danych będzie dużo kosztować.

  • Nie jestem ekspertem od DB, a także nie kontroluję ustawień DB. Rozwiązanie oparte na bazie danych może wymagać niestandardowej konfiguracji, jak to wygląda.

Jeśli przejdziemy do uruchomienia witryny na naszym własnym serwerze, mógłbym rozważyć rozwiązanie oparte na bazie danych. dzięki, Stefan

StefanE
źródło
1
Określ bazę danych, której używasz.
Gerrie Schenck
1
Zamierzam używać MSSQL w nowszej wersji.
StefanE
1
@StefanE, system plików jest pod każdym względem wyspecjalizowaną bazą danych zoptymalizowaną do przechowywania plików.
LukeH

Odpowiedzi:

175

Przechowuj obrazy w systemie plików i lokalizacje obrazów w bazie danych.

Czemu? Ponieważ...

  1. Będziesz mógł wyświetlać zdjęcia jako pliki statyczne.
  2. Do pobrania zdjęć nie jest wymagany dostęp do bazy danych ani kod aplikacji.
  3. Obrazy mogą być przesyłane z innego serwera, aby poprawić wydajność.
  4. Zmniejszy to wąskie gardło bazy danych.
  5. Baza danych ostatecznie przechowuje swoje dane w systemie plików.
  6. Obrazy można łatwo buforować, gdy są przechowywane w systemie plików.
Akbar ibrahim
źródło
1
Ponadto w SQL Server, kiedy przechowujesz obraz jako pole „Obraz”, to właśnie robi SQL - przechowywanie wskaźnika do pliku gdzieś na dysku. W ten sposób omija limit stron 8 KB.
Zhaph - Ben Duguid
9
Naprawiono to SQL Server 2008. Wprowadzono nowy typ FILESTREAM technet.microsoft.com/en-us/library/bb895234.aspx, który pozwala wykorzystać „wydajność systemu plików i jednocześnie zachować spójność transakcyjna między danymi nieustrukturyzowanymi a odpowiadającymi im danymi strukturalnymi "
kristof
Tak, dobrze trafiłeś. moje pytanie brzmi: jaki jest rozmiar kropli? lub ile pamięci może przechowywać?
Ameer
11

W moich ostatnio opracowanych projektach zapisywałem obrazy (i wszelkiego rodzaju dokumenty binarne) jako kolumny obrazów w tabelach bazy danych.

Zaletą posiadania plików przechowywanych w bazie danych jest oczywiście to, że po usunięciu rekordu na dysku twardym nie zostaną zapisane pliki bez odniesień, ponieważ synchronizacja między bazą danych (= metadane) a dyskiem twardym (= przechowywanie plików) nie jest wbudowana i musi być programowany ręcznie.

Korzystając z dzisiejszej technologii, sugeruję przechowywanie obrazów w kolumnach FILESTREAM SQL Server 2008 (przynajmniej to mam zamiar zrobić z moim następnym projektem), ponieważ łączą one zalety przechowywania danych w bazie danych ORAZ posiadania dużych plików binarnych w osobnych plikach (w najmniej według reklam;))

devio
źródło
Czy w ogóle przetestowałeś już funkcjonalność Filestream?
StefanE
1
Właściwie, podczas usuwania rekordu DB, można zakodować, aby usuwał również z systemu plików. Więc uważam, że dobrze jest przechowywać w FS, a nie w DB
kailash19,
9

Porzekadłem zawsze było „Pliki w systemie plików, metadane plików w bazie danych”

Matt Darby
źródło
6

Lepiej przechowywać pliki jako pliki. Różne bazy danych obsługują dane Blob w różny sposób, więc jeśli musisz przeprowadzić migrację zaplecza, możesz mieć kłopoty.

Podczas udostępniania obrazów <img src = do pliku, który już istnieje na serwerze, prawdopodobnie będzie szybsze niż utworzenie pliku tymczasowego z pola bazy danych i wskazanie na to znacznika <img.

Znalazłem tę odpowiedź, szukając go w Google na Twoje pytanie i czytając komentarze pod adresem http://databases.aspfaq.com/database/should-i-store-images-in-the-database-or-the-filesystem.html

iskrzące
źródło
1
skierowany post wydaje się nieco nieaktualny.
devio
6

Zwykle lubię mieć pliki binarne w bazie danych, ponieważ:

  • integralność danych: brak pliku bez odwołań, brak ścieżki w bazie danych bez skojarzonego pliku
  • spójność danych: wykonaj zrzut bazy danych i to wszystko. nie „O zapomniałem kierować do tego katalogu danych”.
chburd
źródło
4

Przechowywanie obrazów w bazie danych dodaje obciążenie bazy danych do obsługi pojedynczych obrazów i utrudnia odciążenie ich do alternatywnego magazynu (S3, Akami), jeśli osiągniesz ten poziom. Przechowywanie ich w bazie danych znacznie ułatwia przenoszenie aplikacji na inny serwer, ponieważ tylko baza danych musi teraz zostać przeniesiona.

Przechowywanie obrazów na dysku ułatwia ich przenoszenie do innego magazynu, sprawia, że ​​obrazy stają się statycznymi elementami, dzięki czemu nie musisz martwić się o nagłówki HTTP w aplikacji internetowej, aby obrazy można było buforować. Wadą jest to, że jeśli kiedykolwiek przeniesiesz swoją aplikację na inny serwer, musisz pamiętać o przeniesieniu również obrazów; coś, o czym łatwo zapomnieć.

Adam Hawes
źródło
3

W przypadku aplikacji internetowych uzyskasz lepszą wydajność dzięki wykorzystaniu systemu plików do przechowywania obrazów. Pozwoli to na łatwe zaimplementowanie buforowania obrazów na wielu poziomach aplikacji. Przechowywanie obrazów w bazie danych ma pewne zalety, ale w większości przypadków są one związane z aplikacjami klienckimi.

Dillie-O
źródło
0

Dodam trochę więcej do i tak już dobrych odpowiedzi. Nadal możesz czerpać korzyści z buforowania, być może zarówno z poziomu WWW, jak i poziomu bazy danych, jeśli pójdziesz ścieżką utrzymywania obrazów w bazie danych.

Myślę, że w przypadku bazy danych można to osiągnąć przez to, jak przechowujesz obrazy w odniesieniu do powiązanych z nimi danych tekstowych i czy możesz uzyskać dostęp do obrazów w określonym zapytaniu, aby baza danych mogła buforować zapytanie (choć tylko teoria nie krępuj się mnie z tej strony nuke).

Jeśli chodzi o stronę internetową, myślę, że skoro pytanie jest oznaczone tagiem asp.net, skorzystasz z procedury obsługi protokołu http do obsługi obrazów. Wtedy masz do dyspozycji wszystkie zalety platformy i możesz zachować czystość logiki domeny, wystarczy przekazać klucz do obrazu do modułu obsługi http.

MotoWilliams
źródło
-1

Dlaczego nie wybrać indywidualnej bazy danych NoSql do przechowywania plików.

Zapewnia integralność danych, spójność danych, o czym wspomniał @chburd.

Podczas gdy ty rdbms nadal trzymaj małe.

Will Wu
źródło
-1
  1. Oto przykład krok po kroku (podejście ogólne, implementacja Springa Eclipse) przechowywania obrazów w systemie plików i przechowywania ich metadanych w bazie danych - http://www.devmanuals.com/tutorials/java/spring/spring3/mvc /Spring3MVCImageUpload.html
  2. Oto przykład - http://www.journaldev.com/2573/spring-mvc-file-upload-example-tutorial-single-and-multiple-files
  3. Możesz także zbadać kod źródłowy tego projektu - https://github.com/jdmr/fileUpload . Zwróć uwagę na ten kontroler.
Lord Nighton
źródło