• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sposoby umieszczania plików w bazie danych

Object Storage Arubacloud
+2 głosów
209 wizyt
pytanie zadane 18 września 2017 w SQL, bazy danych przez boyeo Obywatel (1,120 p.)

Witam 

Mam kilka pytań odnośnie baz danych i poprawnego umiejscawiania danych.Czy poprawnym sposobem jest umieszczanie plików(zdjęć) na serwerze i robienie do nich dowiązań w bazie danych(tnz. scieżkę, rozmiar, format itp) czy lepiej umieszczać pliki bezpośrednio w bazie danych w postaci MediumBlob. W jaki sposób robią to strony które mają dość sporą liczbę użytkowników np Instagram/Fb , jakie rodzaje baz są do tego najlepsze i które sposoby umieszczania są najbardziej optymalne i najszybsze

 

Pozdrawiam i z góry dziękuje za odpowiedz Kubasmiley 

komentarz 18 września 2017 przez Gynvael Coldwind Nałogowiec (27,530 p.)
Dokument sprzed 11 lat. Warto przeczytać, ale byłbym ostrożny w wyciąganych wnioskach.
komentarz 19 września 2017 przez Jedras Maniak (54,860 p.)
Zgadza się, dzięki za uściślenie.

1 odpowiedź

+6 głosów
odpowiedź 18 września 2017 przez Gynvael Coldwind Nałogowiec (27,530 p.)

Bardzo dobre pytanie, ale w zasadzie nie ma na nie prostej odpowiedzi - wszystko zależy od konkretnego przypadku i używanych technologii. Istotne informacje to np.:

  • Czy serwis jest obsługiwany przez jeden serwer na którym stoi baza, czy raczej jest to bardziej skomplikowana architektura wielo-serwerowa?
  • Jeśli baza danych jest na innym serwerze, to czy połączenie sieciowe między nimi jest szybsze od dysku, czy wolniejsze?
  • Jakie są specyfikacje serwerów? Czy np. mają dużo RAMu? A może mają dysku SSD?
  • Czy odnalezienie konkretnych plików musi być szybkie? Czy sam odczyt ma być szybki? A może jest to ostatecznie nieistotne?
  • Czy pliki są tylko-do-odczytu? A może całe będą zmieniane? A może tylko ich fragmenty?
  • Czy dostęp do nich powinien być w jakiś sposób kontrolowany? (ACL? audytowanie (logowanie dostępu do zasobu)?)
  • itd. itp.

W oryginalnym pytaniu wspomniałeś konkretnie o zdjęciach, więc użyje je jako przykładu.

Zdjęcia można scharakteryzować następująco:

  • Jeden plik waży kilkadziesiąt kilobajtów do kilku megabajtów (więc to raczej dłuższe kawałki danych).
  • Można je traktować jako read-only, tj. o ile może będą usuwane, to raczej edycja fragmentów nigdy się nie zdarzy.
  • Praktycznie zawsze będą strumieniowane w całości; random-access jest niepotrzebny.
  • Dobrze jest, jeśli zdjęcia się wyświetlają w miarę szybko, ale ostatecznie nie jest to krytyczne dla serwisu.
  • Załóżmy też, że rozmawiamy o publicznych zdjęciach (brak ACL / audytowania).

I teraz można to rozważyć dla dalszych trzech przypadków:

1. Mały serwis (jeden serwer) z niskim obłożeniem

Przy dobrej konfiguracji bazy/FS (cache/prefetch) i sporej ilości RAMu jest prawie nieistotne gdzie trafią zdjęcia, tj. czy do bazy, czy do systemu plików. Jeśli komuś zależy na prędkość, można zrobić benchmark dla konkretnej technologii (tj. np. kilku różnych rodzajów baz, kilku różnych rodzajów systemów plików). Osobiście stawiam na drobną przewagę FS w tym miejscu z uwagi na przystosowanie do tego typu operacji, chociaż jeśli musisz trzymać jakieś metadane dodatkowo w bazie (i po nie sięgać), to sytuacja może się odwrócić.

Jeśli baza danych nie będzie mogła trzymać takiej ilości danych w pamięci z jakiegoś powodu, będzie wolniejsza, ponieważ będzie musiała doczytać dodatkowe dane z dysku, a potem je przesłać po jakichś socketach/IPC do web aplikacji. Dla porównania, gdyby pliki leżały na dysku, krok "przesłać po jakichś socketach/IPC" by nie istniał (a więc byłoby szybciej).

2. Mały serwis na którym zdjęcia mają się szybko pokazywać, ale jest ich niewiele

W takim wypadku w zasadzie można je trzymać wszystkie cały czas w pamięci. Tego typu rozwiązanie oszczędza jednego transferu danych (np. z systemu plików do pamięci, lub z bazy via sockety/IPC), ale wymaga więcej RAMu.

Szczerze przyznaję, że jak mogę to właśnie tak robię.

3. Większy (kilku serwerowy) serwis z większą liczbą zdjęć (tu wpada FB/Instagram)

W takim wypadku sprawa się komplikuje i pytaniem jest jeszcze ile jest serwerów ze zdjęciami (jeden? kilka?) i jak są połączone z web serwerem, etc. Ostatecznie celem w takim wypadku jest umieszczenie przesyłania statycznych zdjęć jak najbliżej samych web serwerów (czyli okolice server-side'owego front-endu). A potem stajemy przed wyborem czy:

  • Zdjęcia powinny być w bazie danych na osobnych serwerach?
  • Czy może na jakimś pojedynczym FS sieciowym?
  • Czy może powinny być zwielokrotniane na każdym serwerze (tj. cache'owane lokalnie / prefetchowane przy uruchomieniu aplikacji)?

Dużo zależy od ilości zdjęć (setki? tysiące? miliony? miliardy?) i prędkości dysków/sieci; czym więcej zdjęć, tym bardziej zatrze się granica pomiędzy FS a bazą danych, ponieważ oba te zasoby będą de facto musiały stać na wielu osobnych serwerach, i dostęp do nich będzie tylko po sieci. Pewnie lokalny FS będzie użyty co najwyżej jako cache.

W zasadzie w całym tym ostatnim punkcie słowem kluczowym będą "benchmarki" - tj. po prostu będzie trzeba posprawdzać kilka różnych scenariuszy i zobaczyć gdzie czasy wyglądają najlepiej. Pomaga też dobra znajomość środowiska (dostępnych rozwiązań / konfiguracji sprzętowych / etc) na których będzie się stawiać system (wtedy można lepsze decyzje podejmować).

 

Więęęc... zdaję sobie sprawę, że nie odpowiedziałem Ci na pytanie :). Ale może powyższe chociaż trochę wytłumaczy, czemu trudno jest odpowiedzieć na to pytanie w oderwaniu od konkretnego przypadku.

komentarz 18 września 2017 przez boyeo Obywatel (1,120 p.)
Dzięki za nakreślenie tematu. Postaram się go zglebić jeszcze bardziej

Podobne pytania

0 głosów
1 odpowiedź 3,336 wizyt
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 4 grudnia 2017 w SQL, bazy danych przez Urumbur Nowicjusz (140 p.)
0 głosów
1 odpowiedź 184 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...