Przechowywanie pliku w bazie danych, a nie w systemie plików?

83

Ogólnie rzecz biorąc, jak zły wpływ na wydajność ma przechowywanie pliku w bazie danych (w szczególności mssql) w przeciwieństwie do systemu plików? Nie mogę wymyślić powodu poza przenośnością aplikacji, dla którego chciałbym przechowywać moje pliki jako zmienne w SQL Server.

Cade
źródło

Odpowiedzi:

77

Spójrz na tę odpowiedź:

Przechowywanie obrazów w DB - tak czy nie?

Zasadniczo wpływ na przestrzeń i wydajność może być dość duży, w zależności od liczby użytkowników. Należy również pamiętać, że serwery internetowe są tanie i można łatwo dodać więcej, aby zrównoważyć obciążenie, podczas gdy baza danych jest zwykle najdroższą i najtrudniejszą do skalowania częścią architektury internetowej.

Istnieje kilka przeciwstawnych przykładów (np. Microsoft Sharepoint), ale zazwyczaj przechowywanie plików w bazie danych nie jest dobrym pomysłem.

O ile prawdopodobnie nie piszesz aplikacji komputerowych i / lub z grubsza nie wiesz, ilu użytkowników kiedykolwiek będziesz mieć, ale na czymś tak przypadkowym i nieoczekiwanym, jak publiczna witryna internetowa, możesz zapłacić wysoką cenę za przechowywanie plików w bazie danych.

Michael Stum
źródło
36

Jeśli możesz przejść na SQL Server 2008, możesz skorzystać z obsługi FILESTREAM, która zapewnia najlepsze z obu - pliki są przechowywane w systemie plików, ale integracja bazy danych jest znacznie lepsza niż zwykłe przechowywanie ścieżki pliku w polu varchar. Twoje zapytanie może zwrócić standardowy strumień plików .NET, co znacznie upraszcza integrację.

Pierwsze kroki z pamięcią FILESTREAM

Jon Galloway
źródło
1
Mam tutaj rezerwacje. W szczególności kwestia skalowalności i dostępności: w jaki sposób kontrolujesz, gdzie są przechowywane te „obiekty blob”?
Dave Van den Eynde
3
Wydaje się, że skalowalność i dostępność zostały dość dobrze przemyślane - zobacz ten raport: msdn.microsoft.com/en-us/library/cc949109.aspx
Jon Galloway
2
Jedynym zastrzeżeniem jest to, że podczas łączenia się z bazą danych należy używać zintegrowanych zabezpieczeń (tj. Uwierzytelniania systemu Windows): blogs.msdn.com/b/psssql/archive/2008/04/10/…
Sven Grosen
22

Powiedziałbym, że to zależy od twojej sytuacji. Na przykład pracuję w samorządach lokalnych i mamy wiele zdjęć, takich jak zdjęcia mugowe itp. Nie mamy dużej liczby użytkowników, ale musimy mieć dobre zabezpieczenia i kontrolę wokół danych. Baza danych jest dla nas lepszym rozwiązaniem, ponieważ ułatwia to i nie będziemy mieć problemów ze skalowaniem.

Lance Fisher
źródło
3

Z własnego doświadczenia wiem, że zawsze lepiej jest przechowywać pliki jako pliki. Powodem jest to, że system plików jest zoptymalizowany pod kątem przechowywania plików, podczas gdy baza danych nie. Oczywiście są pewne wyjątki (np. Szeroko zapowiadany system plików MS nowej generacji ma być zbudowany na serwerze SQL), ale generalnie to moja zasada.

ZombieSheep
źródło
3

Chociaż wydajność jest problemem, myślę, że nowoczesne projekty baz danych znacznie zmniejszyły problem w przypadku małych plików.

Pomijając wydajność, zależy to również od tego, jak ściśle powiązane są dane. Jeśli plik zawiera dane, które są ściśle powiązane z polami bazy danych, to koncepcyjnie należy do niego i może być przechowywany w blobie. Jeśli zawiera informacje, które mogą potencjalnie odnosić się do wielu rekordów lub mogą mieć pewne zastosowanie poza kontekstem bazy danych, to należy do nich poza. Na przykład obraz na stronie internetowej jest pobierany na oddzielne żądanie od strony, która do niego prowadzi, więc może znajdować się na zewnątrz (w zależności od konkretnego projektu i względów bezpieczeństwa).

Nasz kompromis, i nie obiecuję, że jest najlepszy, polegał na przechowywaniu niewielkich plików XML w bazie danych, ale obrazów i innych plików poza nią.

Marcus Downing
źródło
Co uważasz za mały lub duży plik?
ubiquibacon
1

Zgadzam się z @ZombieSheep. Jeszcze jedna rzecz - generalnie nie uważam, że bazy danych faktycznie muszą być przenośne, ponieważ brakuje Ci wszystkich funkcji, które zapewnia dostawca DBMS. Myślę, że migracja do innej bazy danych byłaby ostatnią rzeczą, którą należałoby rozważyć. Tylko 0,02 dolara

martinsb
źródło
1

Narzut związany z koniecznością przeanalizowania obiektu blob (obrazu) w tablicy bajtów, a następnie zapisania go na dysku w odpowiedniej nazwie pliku, a następnie odczytania tego jest wystarczającym uderzeniem, aby zniechęcić Cię do robienia tego zbyt często, zwłaszcza jeśli pliki są raczej wielkie.

Jon Limjap
źródło
1
Nie widzę żadnej wzmianki, że ten „plik” musi zostać zapisany na dysku i ponownie odczytany.
Dave Van den Eynde
Jest to niejawne zadanie, gdy obrazy muszą być później wyświetlane, zwłaszcza gdy są przechowywane w różnych formatach lub w scenariuszach, w których nie można ich przechowywać w pamięci przez długi czas ze względu na sam rozmiar.
Jon Limjap
0

Nie żeby być niejasnym ani nic takiego, ale myślę, że typ „pliku”, który będziesz przechowywać, jest jednym z największych czynników determinujących. Jeśli mówisz zasadniczo o dużym polu tekstowym, które może być przechowywane jako plik, preferuję przechowywanie bazy danych.

N8g
źródło