Trzymanie plików użytkowników na dysku, czy w bazie danych

Pisząc aplikację internetową, stajemy przez problemem, gdzie zapisywać pliki wysyłane przez użytkowników (obrazy, może filmy).

Mamy dwie opcje:

  • system plików
  • baza danych

Ktoś ma jakieś doświadczenia w tej kwestii? Które szybsze/prostsze w obsłudze?

  • Problem z gatunku trudnych. Trzymanie w bazie ma tą zaletę, że pliki są przy danych je opisujących - więc nie ma problemu z synchronizacją jednego z drugim. Ponadto można łatwo wprowadzić mechanizmy zabezpieczeń. Ułatwiony jest backup. Wadą jest to, że bazy danych to raczej nie są przystosowane do przechowywania dużych rozmiarem binariów. Na dłuższą metę - jak przestaje wystarczać jedna maszyna - to się zaczyna robić mocno kłopotliwe. No i obciążenie silnika bazy danych jest znaczne.

    Ja się skłaniam więc ku przechowywaniu tego typu "załączników" niezależnie od bazy. Zalety: możliwość partycjonowania po wielu serwerach, możliwość nawet w przyszłości łatwego przepchania przez sieć dystrybucji treści (Content Distribution Network). Trzeba dobrze przemyśleć mechanizmy wiązania ze sobą plików na dysku i rekordów w bazie danych, ewentualnie na przyszłość - partycjonowania i balansowania tych zasobów na wielu maszynach, ale efekt jest opłacalny, choćby w samym tym fakcie, że takie pliki można serwować po czystym HTTP, bez przetwarzania server side - co za tym idzie, nie obciąża się tak procesora serwera, a w dodatku w razie potrzeby można użyć tanich i mało kłopotliwych w eksploatacji serwerów na same serwowanie plików.

  • Tutaj będzie pewnie dużo różnych opinii :) Ponieważ zarówno po jednej jak i drugiej stronie znajdziemy mocne strony za danym rozwiązaniem.
    Najszybsze będzie rozwiązanie z systemem plików, ponieważ ingerujemy w mniejszą ilość warstw podczas dostępu do pliku i mamy mniejszym narzut cachingu plików.

    Prostsze w obsłudze/zarządzaniu będzie zdecydowanie baza danych, z systemem plików może ci się po pewnym czasie nie zły burdel zrobić (chociaż można to rozwiązać np. poprzez trzymanie w bazie danych lokalizacji do poszczególnych plików - i tak też ja robię ;)

    Warto wspomnieć jeszcze o 3 możliwości tzn wykorzystania specjalnego repozytorium treści, który poniekąd łączy zalety obydwu rozwiązań, ostatnio natrafiłem na takowy pakiet który zwie się to jackrabbit (niestety póki co nie miałem czasu dokładnie zbadać tą app)

  • Trzymanie plików w bazie wydaje się dobrym pomysłem choćby ze względu na bezpieczeństwo. Szybko jednak okazuje się, że masa z tym problemów. Odradzam takie rozwiązanie.

    Spada wydajność aplikacji gdyż odwołanie do każdego pliku wymaga zapytania do BD. BD szybko puchnie i do tego spróbuj sobie wyobrazić eksport danych.

  • Obecnie wiele baz danych pozwala na przechowywanie w środku dużych plików. Jeżeli zastosujesz to rozwiązanie dobrze jest wydzielić zupełnie niezależną tabelę tylko do plików, ponieważ na przykład w MySQL jeżeli w tabeli jest plik to wydłuża to zwykłe zapytania (nawet nie używające kolumny z plikiem).

    Z drugiej strony można trzymać w bazie tylko lokalizację URL danego pliku albo lokalizację na dysku.

    Osobiście skłaniam się zawsze ku drugiemu rozwiązaniu. Dzięki temu nie ma żadnego ryzyka i problemów z obsługą bazy danych, którą można utrzymać w dosyć dobrej kondycji. Poza tym wydzielenie w ten sposób przechowywania plików sprawia, że możesz łatwo rozbudowywać magazyny danych jeżeli przybędzie ich. Możesz na przykład dostawiać nowe serwery statyczne tylko do hostowania plików i łatwo przenieść pliki z obecnego rozwiązania na rozwiązanie wydzielone zmieniając tylko ścieżki w bazie danych.

    Tak samo łatwo idzie później przebudowa systemu do używania CDN-a który przy dużej liczbie danych i szczególnie filmów bardzo może Ci się przydać.

  • W bazie danych zapisuj tylko miejsce gdzie zapisałeś obrazy/pliki.

Zaloguj się, aby dodać swoją odpowiedź